如何使用 RapidJSON 解析 JSON 键嵌套

How to parse a JSON key nest using RapidJSON

我正在使用 RapidJSON 解析传入的 JSON 文件,我可以迭代并通过不同的嵌套获取值。我的意思是变量值(即:protocolVersion = 2)。但是我无法开始嵌套{:}。以下面的 JSON 为例:

{
   "header":{
      "protocolVersion":2,
      "messageID":2,
      "stationID":224,
      "data": 
           {
           1:
           2:
           3:
           }
   },
}

我想解析“header”和“data”。我正在使用这一行,但它与解析方式不匹配

ItsPduHeader_t& header = message->header;

尝试这个,我得到一个错误:

ItsPduHeader_t& header = doc["header"].GetObject();


error: invalid initialization of non-const reference of type ‘ItsPduHeader_t&’ {aka ‘ItsPduHeader&’} from an rvalue of type ‘rapidjson::GenericValue<rapidjson::UTF8<> >::Object’ {aka ‘rapidjson::GenericObject<false, rapidjson::GenericValue<rapidjson::UTF8<> > >’}
  381 |     ItsPduHeader_t& header = doc["header"].GetObject();

我该怎么做?

RapidJSON source code中有2个重载方法:

Object GetObject() { RAPIDJSON_ASSERT(IsObject()); return Object(*this); }
ConstObject GetObject() const { RAPIDJSON_ASSERT(IsObject()); return ConstObject(*this); }

并且所有这些 return 按值对象。您应该尝试将 header 定义为简单对象(不是引用)或对对象的常量引用。

更新

你的 json 一开始是不正确的。您无法直接从 RapidJSON 简单类型获取 ItsPduHeader_t。您应该获取 header 的 RapidJSON 对象表示,然后获取 data 的 RapidJSON 对象表示并查询它:

const char* json = "{\"header\":{\"protocolVersion\" : 2,\"messageID\":2,\"stationID\":224,\"data\":{\"foo\":\"bar\"}}}";
rapidjson::Document d;
d.Parse(json);

for (const auto& m : d["header"]["data"].GetObject()) {
    std::cout << m.name.GetString() << " " << m.value.GetType() << std::endl;
}

const auto& header = d["header"];
const auto& data = header["data"];

std::cout << "header->data->foo: " << data["foo"].GetString();