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?

user1902467
la source
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"]
SLaks
la source
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'] 
Sohel Ahmed Mesaniya
la source
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"]
t.vdh
la source