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?


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"]

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'] 

¿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"]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.