【问题标题】:How to print or to_string() a nested JSON with unknown structure using Rapidjson如何使用 Rapidjson 打印或 to_string() 具有未知结构的嵌套 JSON
【发布时间】: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 文档类型非常灵活。它具有IsArrayIsObject 等方法来确定对象的类型。一旦你知道对象的类型,它就有迭代数组和对象成员的方法:rapidjson.org/md_doc_tutorial.html。您要做的就是将其重新序列化为 JSON 吗?或者你想以某种结构化的方式打印它?
  • 我阅读了教程,但我遇到了包含未知成员的嵌套 JSON 对象的问题,我将创建示例 C++ 代码并在此处分享以描述我的确切错误,大约需要 30 分钟,主代码非常大,我需要创建一个示例来确定确切的问题。
  • 您可以使用 begin/end 或 MemberBegin/MemberEnd 遍历 GenericObject 以获取对象节点的所有键/值对。
  • 我添加了 RapidJson 将损坏的示例代码,同时使用这种代码结构。我该如何解决这个问题?

标签: c++ json string cout rapidjson


【解决方案1】:

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

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

上面代码的更正版本是:

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;
}

【讨论】:

    猜你喜欢
    • 2019-05-28
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 2019-12-14
    • 1970-01-01
    • 2017-03-18
    • 2015-11-13
    相关资源
    最近更新 更多