Não foi possível acessar a propriedade JSON com o traço "-"

127

Não consigo recuperar um valor de um objeto json quando a string tem um caractere de hífen:

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

Se eu tentar fazer referência ao analisado, jsonObj.profile-idele retornará, ReferenceError: "id" is not definedmas jsonObj.user_id retornará 6789

Não tenho como modificar os valores retornados pela chamada da API externa e tentar analisar a string retornada para remover traços que arruinam os URLs etc., que também são passados. Socorro?

user1902467
fonte
3
Pode ser útil adicionar informações sobre qual idioma / analisador você está tentando usar para analisar o JSON.
Mike Brant
1
Utilities.jsonParsenão diz muito.
Darin Dimitrov

Respostas:

277

jsonObj.profile-idé uma expressão de subtração (ie jsonObj.profile - id).

Para acessar uma chave que contém caracteres que não podem aparecer em um identificador, use colchetes:

jsonObj["profile-id"]
SLaks
fonte
2
Obrigado! Para obter informações: Ele também funciona com angular: {{jsonObj.attributes ["profile-id"]}}
BastienSander
3
quando isso funciona em javascript e sua implementação nativa para acessar uma chave de objeto propriedade por corda, se ele funciona em tudo em cima
John Smith
1
Também funciona para o objeto "estilo" JS! @SLaks Extrapolei esta solução para usar o objeto de estilo JavaScript para definir a propriedade "box-shadow". document.getElementById("someId").style["box-shadow"]="2px 2px 2px #616161";funciona bem!
Eric Hepperle - CodeSlayer2010
2
@ EricHepperle-CodeSlayer2010: Em style.boxShadowvez disso, você deve usar . O styleobjeto converte hífens em camelCase.
Slaks
Doce! Obrigado ... Eu gosto de camel case, método melhor porque menos caracteres para digitar. Verificado funciona !!
precisa saber é o seguinte
3

Além desta resposta , observe que no Node.js, se você acessa o JSON com a sintaxe da matriz, []todas as chaves JSON aninhadas devem seguir essa sintaxe

Este é o caminho errado

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

e fornecerá o erro "indefinido".

Esta é a maneira correta

json['first']['second']['third']['comment'] 
Sohel Ahmed Mesaniya
fonte
Por que isso é um problema? O primeiro punho parece completamente normal. Isso é um bug no idioma?
Nikola Diklic 10/09/19
Se você quiser seguir esse método. Considere usar um utilitário funcional como ramdajs.com/docs/#path
Amrit Pal Singh
2

Para ansible, e usando hífen, isso funcionou para mim:

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