2015-06-11 23 views
1

我想写使用rapidjson萨克斯方式的JSON结构嵌套数组。这是我做的:写有rapidjson的“SAX”的方式

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

我做错了什么,或者我想要什么都不被支持?

回答

1

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