无法确定RapidJSON类型/难以读取三重嵌套字符串

时间:2019-06-21 16:27:33

标签: c++ c++11 visual-c++ rapidjson cereal

我正在尝试使用谷物反序列化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"]

中进行硬编码

0 个答案:

没有答案