我正在尝试使用谷物反序列化JSON消息。 (当前)消息结构如下:
"A":"B",
"C":{"D":"E","F":"G","H":"I"},
"J":"K",
"L":"M",
"N":{"O":{"P":"Q"}}}
最重要的数据是“ Q”。
我可以轻松阅读所有正常的字符串。我能够轻松阅读顶级项目。通过将“ C”视为数组,我最终能够读取“ D”-“ I”(尽管缺少“ [”和“]”)。但是,我无法将“ N”归档为字符串,数组,向量或对象。它只是使iarchive(C);
行上的相应IsString(),IsObject()等检查失败。我看到一个GetType()
,但我不知道在“ N”上调用它,因为我尝试对“ N”进行的任何操作都失败了。
然后我就可以将字符串分解为
{"O":{"P":"Q"}}
很棒,所以只是“ C”,但是更简单。不幸的是,我遇到了和以前一样的问题。
然后我将其分解为{“ P”:“ Q”}并最终能够通过iarchive(value)
来获得Q的值
std::string msgtype,protocol_version, command, radio1_frequency,value;
std::string unit_id[3];
std::stringstream ss(msg->get_payload());
{//at this point, ^ss has the same format as outlined above, from "A" to "Q."
cereal::JSONInputArchive iarchive(ss);
iarchive(CEREAL_NVP(msgtype), CEREAL_NVP(protocol_version), CEREAL_NVP(command),CEREAL_NVP(unit_id));<-----------------------
}
rapidjson::Document doc;
doc.Parse((msg->get_payload()).c_str());
const rapidjson::Value& vars = doc["variables"];//<--this string is N
rapidjson::StringBuffer sb;
rapidjson::Writer<rapidjson::StringBuffer> writer(sb);
vars.Accept(writer);
std::stringstream sst(sb.GetString());
std::cout << sst.str() << "\n"; //here, sst has {"O":{"P":"Q"}}
doc.Parse(sb.GetString());
const rapidjson::Value& val = doc["radio1_frequency"];//<--this string is O
sb.Clear();
rapidjson::Writer<rapidjson::StringBuffer> writerTwo(sb);
val.Accept(writerTwo);
std::cout << sb.GetString() << "\n";//ss3 will now have {"P":"Q"}
std::stringstream ss3(sb.GetString());
{
cereal::JSONInputArchive iarchive(ss3);
iarchive((value));
std::cout << value << '\n';//Q
}
如果我将,CEREAL_NVP(variables)
添加到带有箭头的行中,则会得到以下输出:
terminate called after throwing an instance of 'cereal::RapidJSONException'
what(): rapidjson internal assertion failure: IsString()
Child terminated with signal = 0x6 (SIGABRT)
要明确,我得到了想要的结果,问。我只是觉得必须有更好的方法。我觉得问题的根源在于我无法确定N是什么类型。由于我不知道类型,所以我不知道如何正确地将其存档在谷物中。在使用RapidJSON的C ++ 11和谷物领域中,我能做些什么?
我想知道是否是因为“ O”在字符串的中间有一个数字,并且把它扔掉了。我不希望因为我相信这是一个有效的字符串
edit:我忘了提到“ O”可以更改。因此我将无法在doc["N"]["O"]["P"]