Há duas variantes dessa pergunta: uma variante é onde o dicionário JSON é plano (sem filhos) e outro, onde key está em algum lugar na hierarquia de filhos. No momento em que escrevi isso, o ns.json ainda não tinha um método de conveniência que daria acesso fácil ao teste de uma chave.
Ljgww 19/0218
Respostas:
239
Apenas use x["error_msg"]. Se a propriedade não existir, ela retornará null.
@AndreasFurster Então ele retornará um JValuecujo Valueé null, não apenas null.
svick
1
Se a propriedade poderia ser nullvocê poderia usar x["error_msg"] is Objectpara verificar se a propriedade é definida em JSON objeto
stonito
2
@ user3199329 Essa é apenas uma maneira confusa de escrever x["error_msg"] != null, portanto não, ela não verifica se a propriedade existe e tem o valor de null.
svick
9
@ WilliamT.Mallard Em C # 6, você pode simplificar que usando o operador índice nulo condicional: myJObject["level1property"]?["level2property"].
svick
98
JObjectimplementa IDictionary<string, JToken>, para que você possa usar:
... ou você poderia usar TryGetValue. Ele implementa os dois métodos usando a implementação explícita da interface; portanto, você não pode usá-los sem antes converter para ele IDictionary<string, JToken>.
Eu fino isso será lentamente, em seguida, a resposta aceita, mas obrigado.
SevenDays 27/08
2
@wsevendays, a velocidade importa para você aqui ou está apenas microoptimizando (e baseando isso em suposições)? Você deve usar o que achar mais legível.
svick
A velocidade do processador de 1 GHz do meu telefone WP7 não é boa e eu preciso me preocupar com velocidade.
SevenDays 27/08
1
@wsevendays: Por que seria mais lento (ou mais rápido) do que a resposta aceita?
precisa saber é o seguinte
24
@ wsevenday: Não, não cria um dicionário. JObjectjá implementaIDictionary<string, JToken> . Esta é apenas uma tarefa de referência. E não, a resposta aceita não está verificando se a chave está em uma matriz ... ainda está usando um indexador normal. Só porque parece que o acesso ao array não significa que é o acesso ao array. (Acesso à matriz não pode ser por uma corda em primeiro lugar.)
Jon Skeet
11
JObject.ContainsKey(string propertyName) foi criado como método público na versão 11.0.1
Respostas:
Apenas use
x["error_msg"]
. Se a propriedade não existir, ela retornaránull
.fonte
null
?JValue
cujoValue
énull
, não apenasnull
.null
você poderia usarx["error_msg"] is Object
para verificar se a propriedade é definida em JSON objetox["error_msg"] != null
, portanto não, ela não verifica se a propriedade existe e tem o valor denull
.myJObject["level1property"]?["level2property"]
.JObject
implementaIDictionary<string, JToken>
, para que você possa usar:... ou você poderia usar
TryGetValue
. Ele implementa os dois métodos usando a implementação explícita da interface; portanto, você não pode usá-los sem antes converter para eleIDictionary<string, JToken>
.fonte
JObject
já implementaIDictionary<string, JToken>
. Esta é apenas uma tarefa de referência. E não, a resposta aceita não está verificando se a chave está em uma matriz ... ainda está usando um indexador normal. Só porque parece que o acesso ao array não significa que é o acesso ao array. (Acesso à matriz não pode ser por uma corda em primeiro lugar.)JObject.ContainsKey(string propertyName)
foi criado como método público na versão 11.0.1Documentação - https://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Linq_JObject_ContainsKey.htm
fonte