15

RapidJSONを使用して次のJSON出力を作成できるようにしたい

{
    "year": 2013,
    "league": "national",
    "teams": [
        {
            "teamname": "reds",
            "teamcity": "cincinnati",
            "roster": [
                {
                    "playername": "john",
                    "position": "catcher"
                },
                {
                    "playername": "joe",
                    "position": "pitcher"
                }
            ]
        }
    ]
}

これは有効な JSON です... JSONLint.com で検証済み ドキュメントを作成し、AddMember を使用して「年」と「リーグ」を追加する方法を知っています。

「チーム」や「名簿」のような構造を持つ配列を追加する方法の例を理解できず、見たこともありません

構造の配列である「チーム」をどのように追加しますか? ヘルプや例を教えていただければ幸いです。

4

3 に答える 3

66

std::string& を返す Roster クラスの PlayerName() および Postion() アクセサ関数を含む std::vector 名簿があると仮定しましょう。

rapidjson::Document jsonDoc;
jsonDoc.SetObject();
rapidjson::Value myArray(rapidjson::kArrayType);
rapidjson::Document::AllocatorType& allocator = jsonDoc.GetAllocator();

std::vector<Roster*>::iterator iter = roster.begin();
std::vector<Roster*>::iterator eiter = roster.end();
for (; iter != eiter; ++iter)
{
    rapidjson::Value objValue;
    objValue.SetObject();
    objValue.AddMember("playername", (*iter)->PlayerName().c_str(), allocator);
    objValue.AddMember("position", (*iter)->Position().c_str(), allocator);

    myArray.PushBack(objValue, allocator);
} 

jsonDoc.AddMember("array", myArray, allocator);
rapidjson::StringBuffer strbuf;
rapidjson::Writer<rapidjson::StringBuffer> writer(strbuf);
jsonDoc.Accept(writer);

const char *jsonString = strbuf.GetString();  // to examine the encoding...

これにより、ドキュメント内の構造の配列が取得されます。残りの構造を取得するために必要なことは、rapidjson オブジェクトを相互にネストし、AddMember() を使用して複雑なオブジェクト ツリーを構築することだけです。お役に立てれば。

于 2013-11-21T18:28:27.017 に答える
12

Vs2012/Rapidjson バージョン 0.1 では、StringBuffer からドキュメントを出力すると、次のステートメントが読み取り不能なコードになります。

objValue.AddMember("position", (*iter)->Position().c_str(), allocator);

数時間掘り下げた後、正しい方法でそれを行う方法を見つけました。

Value tmp;
tmp.SetString( (*iter)->Position().c_str(), allocator);
objValue.AddMember("position", tmp, allocator);

ここにチュートリアルがあります: http://miloyip.github.io/rapidjson/md_doc_tutorial.html

于 2015-01-15T07:41:33.840 に答える
4
rapidjson::StringBuffer s;
    rapidjson::Writer<rapidjson::StringBuffer> writer(s);

    writer.StartObject();               

    std::string year("year");
    writer.String(year.c_str(), static_cast<rapidjson::SizeType>(year.length()));
    writer.Int(2013);

    std::string league("league");
    writer.String(league.c_str(), static_cast<rapidjson::SizeType>(league.length()));
    std::string national("national");
    writer.String(national.c_str(), static_cast<rapidjson::SizeType>(national.length()));


    std::string teams("teams");
    writer.String(teams.c_str(), static_cast<rapidjson::SizeType>(teams.length()));

    writer.StartArray();
    writer.StartObject();

    std::string teamname("teamname");
    writer.String(teamname.c_str(), static_cast<rapidjson::SizeType>(teamname.length()));
    std::string reds("reds");
    writer.String(reds.c_str(), static_cast<rapidjson::SizeType>(reds.length()));

    std::string teamcity("teamcity");
    writer.String(teamcity.c_str(), static_cast<rapidjson::SizeType>(teamcity.length()));
    std::string cincinnati("cincinnati");
    writer.String(cincinnati.c_str(), static_cast<rapidjson::SizeType>(cincinnati.length()));

    std::string roster("roster");
    writer.String(roster.c_str(), static_cast<rapidjson::SizeType>(roster.length()));

    writer.StartArray();

    writer.StartObject();
    std::string playername("playername");
    writer.String(playername.c_str(), static_cast<rapidjson::SizeType>(playername.length()));
    std::string john("john");
    writer.String(john.c_str(), static_cast<rapidjson::SizeType>(john.length()));

    std::string position("position");
    writer.String(position.c_str(), static_cast<rapidjson::SizeType>(position.length()));
    std::string catcher("catcher");
    writer.String(catcher.c_str(), static_cast<rapidjson::SizeType>(catcher.length()));
    writer.EndObject();

    // can add one more object in the same manner
    // with player name and position

    writer.EndArray();

    writer.EndObject();

    writer.EndArray();
    writer.EndObject();


s.GetString();
于 2016-07-25T07:55:03.783 に答える