用 "SAX" 方式用 rapidjson 写嵌套数组

Write nested arrays with rapidjson the "SAX" way

我正在尝试使用 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;
}