【发布时间】:2019-12-17 06:32:07
【问题描述】:
编程语言:C++
环境:Linux Ubuntu
编译器:gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
我正在解析一个结构未知的嵌套 JSON(每个键都可以是一个 json 文档),我们不知道键的名称和值。 RapidJson 可以解析它,但我找不到打印它或将它作为字符串对象复制到字符串
我尝试用 Google 搜索,但找不到任何答案。只是类似的是下面的链接:
iterate and retrieve nested object in JSON using rapidjson
但在这种情况下,他们使用键名(不是我的情况)(我的主要假设是 我不知道包含键名的 json 结构)
现在我有这种类型的 JSON 并且想要打印它或 to_string() 它。
我该怎么做? RapidJson 可以吗?
这是我的示例代码:main.cpp
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>
using namespace rapidjson;
void toJson1(Document &oJson)
{
oJson.SetObject();
oJson.AddMember("id", rapidjson::Value(1), oJson.GetAllocator());
const char* json1 = "{\"a\":1,\"b\":\"c\"}";
Document d1;
d1.Parse(json1);
oJson.AddMember("test", d1, oJson.GetAllocator());
return;
}
void toJson(Document &oJson)
{
oJson.SetObject();
oJson.AddMember("id", rapidjson::Value(1), oJson.GetAllocator());
Document d1;
toJson1(d1);
oJson.AddMember("test", d1, oJson.GetAllocator());
return;
}
int main() {
Document d;
toJson(d);
StringBuffer buffer;
Writer<StringBuffer> writer(buffer);
d.Accept(writer);
std::cout << buffer.GetString() << std::endl;
return 0;
}
此代码与上述功能相同,但工作正常,使用该函数并通过引用传递对象使其损坏
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>
int main() {
Document d,d1;
d.SetObject();
d.AddMember("id", rapidjson::Value(1), d.GetAllocator());
d1.SetObject();
d1.AddMember("id", rapidjson::Value(1), d1.GetAllocator());
const char* json1 = "{\"a\":1,\"b\":\"c\"}";
Document d2;
d2.Parse(json1);
d1.AddMember("test", d2, d1.GetAllocator());
d.AddMember("test", d1, d.GetAllocator());
StringBuffer buffer;
Writer<StringBuffer> writer(buffer);
d.Accept(writer);
std::cout << buffer.GetString() << std::endl;
return 0;
}
【问题讨论】:
-
RapidJSON 文档类型非常灵活。它具有
IsArray或IsObject等方法来确定对象的类型。一旦你知道对象的类型,它就有迭代数组和对象成员的方法:rapidjson.org/md_doc_tutorial.html。您要做的就是将其重新序列化为 JSON 吗?或者你想以某种结构化的方式打印它? -
我阅读了教程,但我遇到了包含未知成员的嵌套 JSON 对象的问题,我将创建示例 C++ 代码并在此处分享以描述我的确切错误,大约需要 30 分钟,主代码非常大,我需要创建一个示例来确定确切的问题。
-
您可以使用 begin/end 或 MemberBegin/MemberEnd 遍历 GenericObject 以获取对象节点的所有键/值对。
-
我添加了 RapidJson 将损坏的示例代码,同时使用这种代码结构。我该如何解决这个问题?
标签: c++ json string cout rapidjson