Search code examples
c++assertionsjsoncpp

jsoncpp how to check if tag is null .isNull() throw assertion


Im using jsoncpp , its great but when i need to check if json structure contains tag when i do it with :

UserRoot0["error"].isNull()

its throws me assert from json_value.cpp line 1025

JSON_ASSERT( type_ == nullValue  ||  type_ == objectValue );

i want to check if response im getting is from this type:

{
    "error" : {
        "message" : "Error validating application.",
        "type" : "OAuthException",
        "code" : 190
    }
}

Solution

  • The [] operator is only valid for JsonValue objects that are of type Object or null. All others (Int, Bool, Array, etc.) will assert.

    If your UserRoot0 object is an Array or some other non-Object type, you have some more work to do (like iterating into sub-nodes) to find your target node that may or may not contain the error. Print UserRoot0.toStyledString() to see what your JSON looks like, and make sure it looks like a JSON Object (see json.org for a nice overview of what that is).

    A "ToDo" comment at the top of the json_value.cpp source file (where JSON_ASSERT is defined) implies that the developers may be planning more robust error handling instead of these asserts in future versions, but in the meantime, you can check yourself, like this:

    if(UserRoot0.isObject() && UserRoot0.isMember("error"))
        // Process error node
    else
        // This node isn't an Object node or doesn't contain the "error" key
    

    The isMember() check will also assert for non-Object nodes, so be sure to check isObject() before checking isMember() if UserRoot0 isn't guaranteed to be an Object.