Невозможно получить доступ к свойству JSON с дефисом «-»

127

Я не могу получить значение из объекта json, если в строке есть тире:

{
"profile-id":1234, "user_id":6789
}

Если я попытаюсь сослаться на анализ, jsonObj.profile-idон вернется, ReferenceError: "id" is not definedно jsonObj.user_id вернет 6789

У меня нет способа изменить значения, возвращаемые внешним вызовом api, и попытка проанализировать возвращаемую строку, чтобы удалить тире, разрушит URL-адреса и т.д., которые также передаются. Помогите?

user1902467
источник
3
Это может помочь добавить информацию о том, какой язык / парсер вы пытаетесь использовать для синтаксического анализа JSON.
Майк Брант,
1
Utilities.jsonParseне говорит много.
Дарин Димитров

Ответы:

279

jsonObj.profile-idэто выражение вычитания (т.е. jsonObj.profile - id).

Чтобы получить доступ к ключу, который содержит символы, которые не могут присутствовать в идентификаторе, используйте скобки:

jsonObj["profile-id"]
SLaks
источник
2
Спасибо! Для информации: он также работает с angular: {{jsonObj.attributes ["profile-id"]}}
BastienSander
3
когда это работает в javascript и его собственной реализации для доступа к ключу свойства объекта по строке, убедитесь, что он работает во всем наверху
Джон Смит,
1
Также работает для объекта "стиля" JS! @SLaks Я экстраполировал это решение на использование объекта стиля JavaScript для установки свойства box-shadow. document.getElementById("someId").style["box-shadow"]="2px 2px 2px #616161";прекрасно работает!
Эрик Хепперле - CodeSlayer2010
2
@ EricHepperle-CodeSlayer2010: вы должны использовать style.boxShadowвместо этого. В styleобъекте новообращенных дефисов верблюжий.
SLaks 05
Сладкий! Спасибо ... Мне нравится случай верблюда, метод лучше, потому что меньше символов для ввода. Проверено работает !!
Эрик Хепперле - CodeSlayer2010
3

В дополнение к этому ответу обратите внимание, что в Node.js, если вы обращаетесь к JSON с синтаксисом массива, []все вложенные ключи JSON должны следовать этому синтаксису

Это неправильный путь

json.first.second.third['comment']

и выдаст вам ошибку undefined.

Это правильный путь

json['first']['second']['third']['comment'] 
Сохель Ахмед Месания
источник
Почему это проблема? Первый способ выглядит совершенно нормально. Это ошибка языка?
Никола Диклич
Если вы хотите использовать этот метод. Рассмотрите возможность использования функциональной утилиты, такой как ramdajs.com/docs/#path
Амрит Пал Сингх,
2

Для возможности и использования дефиса это сработало для меня:

    - name: free-ud-ssd-space-in-percent
      debug:
        var: clusterInfo.json.content["free-ud-ssd-space-in-percent"]
t.vdh
источник