我希望能够使用rapidJSON
创建以下JSON输出{
"year": 2013,
"league": "national",
"teams": [
{
"teamname": "reds",
"teamcity": "cincinnati",
"roster": [
{
"playername": "john",
"position": "catcher"
},
{
"playername": "joe",
"position": "pitcher"
}
]
}
]
}
这是有效的JSON ...在JSONLint.com上验证 我知道如何创建文档并使用AddMember添加“年份”和“联盟”。
我无法弄清楚并且没有看到任何有关如何添加具有“团队”或“名册”等结构的数组的示例
如何添加“团队”,这是一组结构? 任何帮助或指出我的例子都会很棒。
答案 0 :(得分:47)
让我们假设我们有一个std :: vector名单,其中包含返回std :: string&的Roster类上的PlayerName()和Postion()访问器函数。
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()来构建复杂的对象树。希望这会有所帮助。
答案 1 :(得分:10)
在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
答案 2 :(得分: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();