Nie można uzyskać dostępu do właściwości JSON za pomocą myślnika „-”

127

Nie mogę pobrać wartości z obiektu json, gdy ciąg ma znak myślnika:

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

Jeśli spróbuję odwołać się do przeanalizowanych jsonObj.profile-id, zwraca, ReferenceError: "id" is not definedale jsonObj.user_id zwróci 6789

Nie mam sposobu na zmodyfikowanie wartości zwracanych przez zewnętrzne wywołanie interfejsu API, a próba przeanalizowania zwróconego ciągu w celu usunięcia myślników zrujnuje adresy URL itp., Które również są przekazywane. Wsparcie?

user1902467
źródło
3
Pomocne może być dodanie informacji o języku / parserze, którego próbujesz użyć do przeanalizowania JSON.
Mike Brant
1
Utilities.jsonParseniewiele mówi.
Darin Dimitrov

Odpowiedzi:

278

jsonObj.profile-idjest wyrażeniem odejmującym (tj jsonObj.profile - id.).

Aby uzyskać dostęp do klucza zawierającego znaki, które nie mogą pojawić się w identyfikatorze, użyj nawiasów:

jsonObj["profile-id"]
SLaks
źródło
2
Dzięki! Informacje: działa również z angular: {{jsonObj.attributes ["profile-id"]}}
BastienSander
3
kiedy to działa w javascript i jego natywnej implementacji, aby uzyskać dostęp do klucza właściwości obiektu za pomocą ciągu, upewnij się, że działa we wszystkim na górze
john Smith
1
Działa również dla obiektu „style” JS! @SLaks ekstrapolowałem to rozwiązanie na użycie obiektu w stylu JavaScript do ustawienia właściwości „box-shadow”. document.getElementById("someId").style["box-shadow"]="2px 2px 2px #616161";działa świetnie!
Eric Hepperle - CodeSlayer2010
2
@ EricHepperle-CodeSlayer2010: Zamiast tego powinieneś użyć style.boxShadow. W stylenawróceni obiektów łączniki do CamelCase.
SLaks
Słodkie! Dzięki ... Podoba mi się obudowa wielbłąda, metoda lepsza, ponieważ mniej znaków do wpisania. Zweryfikowano, że działa !!
Eric Hepperle - CodeSlayer2010
3

Oprócz tej odpowiedzi zwróć uwagę, że w Node.js, jeśli uzyskujesz dostęp do JSON za pomocą składni tablicy[] wszystkie zagnieżdżone klucze JSON powinny mieć tę składnię

To jest zły sposób

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

i wyświetli błąd „nieokreślony”.

To jest właściwy sposób

json['first']['second']['third']['comment'] 
Sohel Ahmed Mesaniya
źródło
Dlaczego jest to problem? Pierwszy sposób wygląda zupełnie normalnie. Czy to błąd w języku?
Nikola Diklic
Jeśli chcesz skorzystać z tej metody. Rozważ użycie funkcjonalnego narzędzia, takiego jak ramdajs.com/docs/#path
Amrit Pal Singh
2

W przypadku ansibla i używania łącznika zadziałało to:

    - name: free-ud-ssd-space-in-percent
      debug:
        var: clusterInfo.json.content["free-ud-ssd-space-in-percent"]
t.vdh
źródło