No se puede acceder a la propiedad JSON con el guión "-"

127

No puedo recuperar un valor de un objeto json cuando la cadena tiene un carácter de guión:

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

Si trato de hacer referencia al analizado jsonObj.profile-id, regresa ReferenceError: "id" is not definedpero jsonObj.user_id devolverá 6789

No tengo una manera de modificar los valores que devuelve la llamada API externa y tratar de analizar la cadena devuelta para eliminar guiones arruinará las URL, etc., que también se pasan. ¿Ayuda?

user1902467
fuente
3
Puede ser útil agregar información sobre qué idioma / analizador está intentando usar para analizar el JSON.
Mike Brant
1
Utilities.jsonParseno dice mucho
Darin Dimitrov

Respuestas:

278

jsonObj.profile-ides una expresión de resta (es decir jsonObj.profile - id).

Para acceder a una clave que contiene caracteres que no pueden aparecer en un identificador, use corchetes:

jsonObj["profile-id"]
SLaks
fuente
2
¡Gracias! Para información: también funciona con angular: {{jsonObj.attributes ["profile-id"]}}
BastienSander
3
cuando esto funciona en JavaScript y su aplicación nativa para acceder a una clave de propiedad de objeto por la cadena, asegurarse de que funciona en todo, en la parte superior
John Smith
1
¡También funciona para el objeto "estilo" JS! @SLaks Extrapolé esta solución al uso del objeto de estilo JavaScript para configurar la propiedad "box-shadow". document.getElementById("someId").style["box-shadow"]="2px 2px 2px #616161";¡Funciona genial!
Eric Hepperle - CodeSlayer2010
2
@ EricHepperle-CodeSlayer2010: Debería usar style.boxShadowen su lugar. El styleobjeto convierte guiones a camelCase.
SLaks
¡Dulce! Gracias ... Me gusta el caso de camello, método mejor porque menos caracteres para escribir. Verificado funciona !!
Eric Hepperle - CodeSlayer2010
3

Además de esta respuesta , tenga en cuenta que en Node.js si accede a JSON con la sintaxis de matriz, []todas las claves JSON anidadas deben seguir esa sintaxis

Este es el camino equivocado

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

y le dará el error 'indefinido'.

Esta es la forma correcta

json['first']['second']['third']['comment'] 
Sohel Ahmed Mesaniya
fuente
¿Por qué es esto un problema? La primera forma se ve completamente normal. ¿Es esto un error en el idioma?
Nikola Diklic
Si quieres ir con este método. Considere usar una utilidad funcional como ramdajs.com/docs/#path
Amrit Pal Singh
2

Para ansible, y usando guiones, esto funcionó para mí:

    - name: free-ud-ssd-space-in-percent
      debug:
        var: clusterInfo.json.content["free-ud-ssd-space-in-percent"]
t.vdh
fuente