以"SAX"方式使用 rapidjson 编写嵌套数组

Write nested arrays with rapidjson the "SAX" way

本文关键字:嵌套 数组 SAX 方式使 rapidjson      更新时间:2023-10-16

我正在尝试使用 rapidjson 以 sax 方式编写 json 结构。这是我的工作:

  StringBuffer sb;
  PrettyWriter<StringBuffer> writer(sb);
  writer.StartObject();
  writer.Key("user");
  writer.StartArray();
  OperatorAcPtrList::iterator xIt;
  for (xIt = userList.begin(); xIt != userList.end(); xIt++)
  {
    writer.Key("userId");
    writer.Uint((*xIt)->id);
    writer.Key("productIdList");
    writer.StartArray();
    ProductIdList::iterator xPrdIdIt;
    for (xPrdIdIt = ((*xIt)->productList).begin(); 
        xPrdIdIt != ((*xIt)->productList).end(); xPrdIdIt++)
    {
      writer.Uint(*xPrdIdIt);
    }
    writer.EndArray();
  }
  writer.EndArray();
  writer.EndObject();

但结果不是我所期望的,而是:

{
    "userList": [
        "userId", 
        20,
        "productIdList",
        [
           1,
           2
        ],
        "userId",
        21,
        "productIdList",
        [
           1,
           2
        ]
    ]
}

看起来第一个 StartArray EndArray 中的所有内容都变成了一个数组元素。相反,我想获得的是:

{
    "userList": [
        {
            "userId" : 20,
            "productIdList" : [1, 2],
        },
        {
            "userId" : 21,
            "productIdList" : [1, 2]
        }
    ]
}

我做错了什么还是根本不支持我想要的东西?

在 for 循环中调用 writer.Key("userId"); 之前,请添加 writer.StartObject(); ,并相应地添加writer.EndObject();。下面是一个示例:

#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>
using namespace rapidjson;
using namespace std;
int main() {
    StringBuffer s;
    Writer<StringBuffer> writer(s);
    writer.StartObject();
    writer.Key("userList");
    writer.StartArray();
    writer.StartObject();
    writer.Key("userId");
    writer.Uint(20);
    writer.Key("productIdList");
    writer.StartArray();
    for (unsigned i = 1; i < 3; i++)
        writer.Uint(i);
    writer.EndArray();
    writer.EndObject();
    writer.StartObject();
    writer.Key("userId");
    writer.Uint(21);
    writer.Key("productIdList");
    writer.StartArray();
    for (unsigned i = 1; i < 3; i++)
        writer.Uint(i);
    writer.EndArray();
    writer.EndObject();
    writer.EndArray();
    writer.EndObject();
    cout << s.GetString() << endl;
}