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