如何使用 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();
我正在使用 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();