如何使用 Rapidjson 打印或 to_string() 具有未知结构的嵌套 JSON

How to print or to_string() a nested JSON with unknown structure using Rapidjson

编程语言:C++

环境:Linux Ubuntu

编译器:gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0

我正在解析具有未知结构的嵌套 JSON(每个键可以是一个 json 文档)我们不知道键的名称和值。 RapidJson 可以解析它,但我找不到打印它或将其作为字符串对象复制到字符串的方法

我尝试 Google 它但找不到任何答案。只是类似的是下面的 link:

但在这种情况下他们使用键名(不是我的情况)(我的主要假设我不知道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;
}

经过多次尝试,我终于找到了解决方案。

在每个函数中我们应该重用外部文档的Allocator

上面代码的更正版本是:

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(&oJson.GetAllocator());
    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(&oJson.GetAllocator());
    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;
}