Impossible d'accéder à la propriété JSON avec le tiret «-»


127

Je ne parviens pas à récupérer une valeur à partir d'un objet json lorsque la chaîne a un caractère tiret:

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

Si j'essaie de référencer l'analysé, jsonObj.profile-idil retourne ReferenceError: "id" is not definedmais jsonObj.user_id retournera 6789

Je n'ai pas de moyen de modifier les valeurs renvoyées par l'appel d'API externe et d'essayer d'analyser la chaîne retournée afin de supprimer les tirets ruinera les URL, etc., qui sont également transmises. Aidez-moi?


3
Il peut être utile d'ajouter des informations sur la langue / l'analyseur que vous essayez d'utiliser pour analyser le JSON.
Mike Brant

1
Utilities.jsonParsene dit pas grand-chose.
Darin Dimitrov

Réponses:


279

jsonObj.profile-idest une expression de soustraction (ie jsonObj.profile - id).

Pour accéder à une clé contenant des caractères qui ne peuvent pas apparaître dans un identifiant, utilisez des crochets:

jsonObj["profile-id"]

2
Merci! Pour information: Il fonctionne également avec angular: {{jsonObj.attributes ["profile-id"]}}
BastienSander

3
quand cela fonctionne en javascript et c'est l'implémentation native pour accéder à une clé de propriété d'objet par chaîne, assurez-vous que cela fonctionne dans tout ce qui se trouve en haut
john Smith

1
Fonctionne également pour l'objet JS "style"! @SLaks J'ai extrapolé cette solution à l'utilisation de l'objet de style JavaScript pour définir la propriété "box-shadow". document.getElementById("someId").style["box-shadow"]="2px 2px 2px #616161";fonctionne très bien!
Eric Hepperle - CodeSlayer2010

2
@ EricHepperle-CodeSlayer2010: Vous devriez utiliser à la style.boxShadowplace. L' styleobjet convertit les traits d'union en camelCase.
SLaks

Doux! Merci ... J'aime le cas de chameau, la méthode est meilleure car moins de caractères à taper. Vérifié ça marche !!
Eric Hepperle - CodeSlayer2010

3

En plus de cette réponse , notez que dans Node.js, si vous accédez à JSON avec la syntaxe de tableau, []toutes les clés JSON imbriquées doivent suivre cette syntaxe

C'est la mauvaise façon

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

et vous donnera l'erreur «indéfinie».

C'est la bonne manière

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

Pourquoi est-ce un problème? Le premier chemin semble tout à fait normal. Est-ce un bug dans la langue?
Nikola Diklic

Si vous souhaitez utiliser cette méthode. Envisagez d'utiliser un utilitaire fonctionnel tel que ramdajs.com/docs/#path
Amrit Pal Singh

2

Pour ansible, et en utilisant un trait d'union, cela a fonctionné pour moi:

    - name: free-ud-ssd-space-in-percent
      debug:
        var: clusterInfo.json.content["free-ud-ssd-space-in-percent"]
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.