15
{"hi": "hellow",
"first":
    {"next":[
            {"key":"important_value"}
        ]
    }

}

配列内の RapidJSON へのアクセス:

これは機能します:cout << "HI VALUE:" << variable["hi"].GetString() << endl;これは出力されます:hellow予想どおり、問題は、「重要な値」を取得したい場合のように内部の値にアクセスすることですcout << "Key VALUE:" << variable["first"]["next"][0]["key"].GetString() << endl ;。 "配列の最初の項目で、この場合、[0]エラーを引き起こしているのは です。

インデックスで取得するにはどうすればよいですか? 私の説明が明確であることを願っています。

前もって感謝します。

4

5 に答える 5

23

JSON

    {"hi": "hellow", "first":  {"next":[{"key":"important_value"}  ] } }

コード:

rapidjson::Document document;       

if (document.Parse<0>(json).HasParseError() == false)
{
    const Value& a = document["first"];

    const Value& b = a["next"];

    // rapidjson uses SizeType instead of size_t.
    for (rapidjson::SizeType i = 0; i < b.Size(); i++)
    {
        const Value& c = b[i];

        printf("%s \n",c["key"].GetString());
    }        
}

important_valueを出力します

于 2012-04-06T19:14:58.717 に答える
14

[アップデート]

貢献者の巧妙な作業により、RapidJSON は0文字列からリテラルを明確にすることができるようになりました。したがって、問題は発生しなくなりました。

https://github.com/miloyip/rapidjson/issues/167


問題は、mjean が指摘したように、コンパイラは、オブジェクト メンバー アクセサーまたは配列要素アクセサーをリテラルで呼び出す必要があるかどうかを判断できません0

GenericValue& operator[](const Ch* name)
GenericValue& operator[](SizeType index)

[0u]またはを使用すると、[SizeType(0)]これを回避できます。

この問題に対処する別の方法は、operator[] にオーバーロードされたバージョンを使用しないことです。たとえば、operator()1 つのタイプのアクセスに使用します。または、通常の関数を使用しGetMember()ますGetElement()。しかし、私は今のところこれを好みません。他の提案は大歓迎です。

于 2012-11-14T07:41:39.433 に答える
3

これはtutorial.cppファイルで気づきました。

// Note:
//int x = a[0].GetInt();         // Error: operator[ is ambiguous, as 0 also mean a null pointer of const char* type.
int y = a[SizeType(0)].GetInt(); // Cast to SizeType will work.
int z = a[0u].GetInt();          // This works too.

私はそれをテストしませんでしたが、あなたはこれらの1つを試してみたいかもしれません。

variable ["first"] ["next"] [0u] ["key"]。GetString()

variable ["first"] ["next"] [SizeType(0)] ["key"]。GetString()

于 2012-04-17T14:47:47.850 に答える