Impossibile accedere alla proprietà JSON con il trattino "-"


127

Non riesco a recuperare un valore da un oggetto json quando la stringa ha un trattino:

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

Se provo a fare riferimento al parsed jsonObj.profile-id, restituisce ReferenceError: "id" is not definedma jsonObj.user_id restituirà 6789

Non ho un modo per modificare i valori restituiti dalla chiamata api esterna e provare ad analizzare la stringa restituita per rimuovere i trattini rovinerà anche gli URL, ecc., Che vengono passati. Aiuto?


3
Potrebbe essere utile aggiungere informazioni su quale lingua / parser stai tentando di utilizzare per analizzare il JSON.
Mike Brant

1
Utilities.jsonParsenon dice molto.
Darin Dimitrov

Risposte:


279

jsonObj.profile-idè un'espressione di sottrazione (cioè jsonObj.profile - id).

Per accedere a una chiave che contiene caratteri che non possono apparire in un identificatore, usa le parentesi:

jsonObj["profile-id"]

2
Grazie! Per informazioni: funziona anche con angular: {{jsonObj.attributes ["profile-id"]}}
BastienSander

3
quando funziona in javascript ed è l'implementazione nativa per accedere a una chiave di proprietà dell'oggetto per stringa, certo che funziona in tutto in alto
John Smith

1
Funziona anche per oggetti "stile" JS! @SLaks Ho estrapolato questa soluzione utilizzando l'oggetto di stile JavaScript per l'impostazione della proprietà "box-shadow". document.getElementById("someId").style["box-shadow"]="2px 2px 2px #616161";funziona alla grande!
Eric Hepperle - CodeSlayer2010

2
@ EricHepperle-CodeSlayer2010: dovresti usare style.boxShadowinvece. L' styleoggetto converte i trattini in camelCase.
SLaks

Dolce! Grazie ... mi piace la custodia del cammello, metodo migliore perché meno caratteri da digitare. Verificato che funziona !!
Eric Hepperle - CodeSlayer2010

3

Oltre a questa risposta , nota che in Node.js se accedi a JSON con la sintassi dell'array, []tutte le chiavi JSON nidificate dovrebbero seguire quella sintassi

Questo è il modo sbagliato

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

e ti darà l'errore "non definito".

Questo è il modo corretto

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

Perchè questo è un problema? Il modo in cui pugno sembra completamente normale. È un bug nella lingua?
Nikola Diklic

Se vuoi seguire questo metodo. Prendi in considerazione l'utilizzo di un'utilità funzionale come ramdajs.com/docs/#path
Amrit Pal Singh

2

Per ansible e usando il trattino, questo ha funzionato per me:

    - name: free-ud-ssd-space-in-percent
      debug:
        var: clusterInfo.json.content["free-ud-ssd-space-in-percent"]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.