RapidJSON 踩过的坑

RapidJSON 的坑--允许Object对象存在相同的key,且key为数字时序列化报异常

测试代码如下:

 1 void show(rapidjson::Document& doc)
 2 {
 3     printf("----------------- for iterator\nMemberCount:%d\n", doc.MemberCount());
 4     for(auto it=doc.MemberBegin();it!=doc.MemberEnd();it++)
 5     {
 6       if (it->name.IsString())
 7         printf("\"%s\":\"%s\"\n",it->name.GetString(), it->value.GetString());
 8       else
 9         printf("%d:\"%s\"\n",it->name.GetInt(), it->value.GetString());
10     }
11     printf("----------------- for iterator end\n");
12 }
13 
14 void testJson(){
15     rapidjson::Document    doc;
16     doc.SetObject();
17     rapidjson::Document::AllocatorType& allocator = doc.GetAllocator();
18     rapidjson::Value key, val;
19     key.SetString("12345");
20 
21     std::string aaa="aaa";
22     for(int i=0; i<10;i++)
23     {
24       std::string a=aaa+std::to_string(i);
25       val.SetString(a.data(), allocator);
26       doc.AddMember(key, val, allocator);
27       // doc["aaa"]=val; // 不能插入
28       // doc[a.data()]=val; // 不能插入
29     }
30     show(doc);
31     // std::string bbb="bbb";
32     // for(int i=0; i<10;i++)
33     // {
34     //   key.SetInt(12345+i); // 数值的key 在输出 json-str的时候会报异常
35     //   val.SetString((bbb+std::to_string(i)).data(), allocator);
36     //   doc.AddMember(key, val, allocator);
37     // }
38     // show(doc);
39     //
40     rapidjson::StringBuffer jsonBuffer;
41     rapidjson::Writer<rapidjson::StringBuffer> writer(jsonBuffer);
42     doc.Accept(writer);
43     std::string outJson = jsonBuffer.GetString();
44     printf("json str:%s\n",outJson.data());
45     //
46     doc.Clear();
47     doc.Parse(outJson.data());
48     printf("----------------- Parse\nMemberCount:%d\n", doc.MemberCount());
49     printf("doc['12345']=%s\n",doc["12345"].GetString());
50     printf("doc[12345]=%s\n",doc[12345].GetString());
51     show(doc);
52   printf("end");
53 }

 

RapidJSON 的坑--rapidjson::Value 构造函数必须要设置类型

1 std::string a1="key1";
2 std::string b1="value1";
3 rapidjson::Value t1; // t1(rapidjson::kStringValue)
4 t1.SetString(b1.data(),doc.GetAllocator());
5 
6 rapidjson::Value t2; //t2(rapidjson::kObjectValue)
7 t2.AddMember(a1.data(), b1, doc.GetAllocator());
8 
9 printf("%s", t2.GetString()); // output is `null`

不仅仅数据没有, 还有在使用过程中可能抛出异常.

 

posted @ 2024-09-10 15:31  _Ong  阅读(28)  评论(0编辑  收藏  举报