jsoncpp como verificar se a tag é nulo .isNull() throw declaração
-
10-12-2019 - |
Pergunta
Im usando jsoncpp , seu grande, mas quando eu preciso verificar se a estrutura json contém tag quando eu faço com ele :
UserRoot0["error"].isNull()
seu lança-me afirmar, a partir de json_value.cpp linha de 1025
JSON_ASSERT( type_ == nullValue || type_ == objectValue );
quero verificar se a resposta estou recebendo é a partir deste tipo:
{
"error" : {
"message" : "Error validating application.",
"type" : "OAuthException",
"code" : 190
}
}
Solução
O []
o operador só é válida para JsonValue
objetos que são do tipo Object
ou nulo.Todos os outros (Int
, Bool
, Array
, etc.) vai valer.
Se o seu UserRoot0
o objeto é uma Array
ou algum outro nãoObject
tipo, você tem mais algum trabalho para fazer (como iterar em sub-nós) para localizar o nó de destino, que pode conter ou não o erro.Imprimir UserRoot0.toStyledString()
para ver o que o JSON parece, e certifique-se de que ele se parece com um Objeto JSON (ver json.org para uma boa visão geral do que é).
Um comentário "ToDo" no topo da json_value.cpp arquivo de origem (onde JSON_ASSERT
é definido) implica que os desenvolvedores podem estar planejando mais robusta de tratamento de erro em vez de estas declarações em versões futuras, mas, entretanto, pode verificar-se, como este:
if(UserRoot0.isObject() && UserRoot0.isMember("error"))
// Process error node
else
// This node isn't an Object node or doesn't contain the "error" key
O isMember()
verifique também vai valer para os não-Object
nós, portanto, certifique-se de verificar isObject()
antes de verificar isMember()
se UserRoot0
não é garantido para ser um Object
.
Outras dicas
Eu tropecei neste também.Como Ennael diz que você precisa se certificar de que você está lidando com um tipo de objeto.FWIW meu problema foi causado por utilizar o JSON como:
"error" : {
"code" : 190
}
...em vez do que eu pretendia:
{
"error" : {
"code" : 190
}
}
Excluindo o exterior conjunto de parêntesis fará com que o tipo de valor para se tornar seqüência de caracteres em vez de objeto.