10

私は jsoncpp を使用していますが、それを行うときにjson構造にタグが含まれているかどうかを確認する必要がある場合:

UserRoot0["error"].isNull()

json_value.cpp 行 1025 からアサートがスローされます

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

取得している応答がこのタイプからのものかどうかを確認したい:

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

2 に答える 2

16

演算子は、タイプまたはnullのオブジェクト[]に対してのみ有効です。他のすべて(、、、など)はアサートします。JsonValueObjectIntBoolArray

オブジェクトUserRoot0Arrayまたはその他の非Objectタイプの場合、エラーが含まれる場合と含まれない場合があるターゲットノードを見つけるために、さらに作業を行う必要があります(サブノードへの反復など)。印刷UserRoot0.toStyledString()してJSONがどのように見えるかを確認し、JSONオブジェクトのように見えることを確認します(それが何であるかの概要については、 json.orgを参照してください)。

json_value.cppソースファイル(JSON_ASSERT定義されている場合)の上部にある「ToDo」コメントは、開発者が将来のバージョンでこれらのアサートの代わりに、より堅牢なエラー処理を計画している可能性があることを意味しますが、それまでの間、次のように自分で確認できます。これ:

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

このチェックは非ノードisMember()に対してもアサートされるため、がであることが保証されていないかどうかをチェックする前に必ずチェックしてください。ObjectisObject()isMember()UserRoot0Object

于 2012-03-21T18:04:38.757 に答える
2

私もこれにつまずいた。Ennael が言うように、オブジェクト型を扱っていることを確認する必要があります。FWIW私の問題は、次のようなJSONを使用することによって引き起こされました:

    "error" : {
        "code" : 190
    }

...私が意図したものの代わりに:

{
    "error" : {
        "code" : 190
    }
}

括弧の外側のセットを除外すると、値の型がオブジェクトではなく文字列になります。

于 2012-06-19T19:33:28.347 に答える