json.net tem método-chave?

139

Se minha resposta tiver "erro" principal, preciso processar o erro e mostrar a caixa de aviso.

Existe o método "haskey" existente no json.net? Gostar:

var x= JObject.Parse(string_my);
if(x.HasKey["error_msg"])
    MessageBox.Show("Error!")
Sete dias
fonte
1
Por favor, consulte a minha resposta aqui .
Ben
Eu respondi a uma pergunta com problema semelhante aqui: stackoverflow.com/a/47204235/1037314
Ben
1
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.

svick
fonte
37
E se o valor da propriedade for null?
Andreas Furster 04/03/2015
67
@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:

IDictionary<string, JToken> dictionary = x;
if (dictionary.ContainsKey("error_msg"))

... 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>.

Jon Skeet
fonte
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. JObject já implementa IDictionary<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