QuickJSON добавляет массив структур

Я хочу иметь возможность создавать следующий вывод JSON, используя quickJSON

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

Это действительный JSON... Проверено на JSONLint.com Я знаю, как создать документ и использовать AddMember для добавления "год" и "лига".

Я не могу понять и не видел примеров того, как добавить массив, который имеет такую ​​структуру, как "команды" или "список"

Как добавить "команды", которые представляют собой массив структур? Любая помощь или указать мне на пример было бы здорово.

Ответ 1

Предположим, что у нас есть список std::vector, содержащий функции AccessName() и Postion() в классе Roster, которые возвращают std::string &.

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...

Это даст вам массив структур в документе. Все, что вам нужно сделать, чтобы получить остальную структуру, состоит в том, чтобы встраивать объекты quickjson друг в друга и использовать AddMember() для создания сложного дерева объектов. Надеюсь, это поможет.

Ответ 2

В Vs2012/Rapidjson Version 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

Ответ 3

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();