RapidJSON 我真的不会用,求指点

2015-05-05 14:29:07 +08:00
 laoyur

以前一直用的jsoncpp,各种好用。
考虑到效率,现在想迁移到RapidJSON,可是发现真的不会用,官方文档也看了,还是有疑问。因为觉得是自己的使用问题,发到GitHub上感觉不太合适,所以就发到这里了。请各位轻喷。

版本:试过master和1.0.1

问题1:
为什么以下的写法不对:

Document doc;
doc.SetObject();

Value v(kArrayType);

doc.AddMember("array1", v, doc.GetAllocator());

必须使用这种方式才行:

Document doc;
doc.SetObject();

Value v;
doc.AddMember("array1", v, doc.GetAllocator());
doc["array1"].SetArray();

问题2:
为什么以下代码段生成的json跟预想中的不一样

Document doc;
doc.SetObject();

Value v;
doc.AddMember("array1", v, doc.GetAllocator());
doc["array1"].SetArray();

for (int i = 0; i < 2; i++) {

    Value obj;

    doc["array1"].PushBack(obj, doc.GetAllocator());
    doc["array1"][i].SetObject();

    Value arrayOfObj;

    doc["array1"][i].AddMember("array2", arrayOfObj, doc.GetAllocator());
    doc["array1"][i]["array2"].SetArray();

    for (int j = 0; j < 2; j++) {

        Value obj1;

        doc["array1"][i]["array2"].PushBack(obj1, doc.GetAllocator());
        doc["array1"][i]["array2"][j].SetObject();
    }
}

StringBuffer buffer;
PrettyWriter<StringBuffer> writer(buffer);
doc.Accept(writer);

const char* outputJson = buffer.GetString();

最后生成的json是:

{
    "array1":
    [
        {
            "array2":
                [
                    {},
                    null
                ]
        },
        null
    ]
}

预想中的应该是:

{
    "array1":
    [
        {
            "array2":
                [
                    {},
                    {}
                ]
        },
        {
            "array2":
                [
                    {},
                    {}
                ]
        },
    ]
}
1492 次点击
所在节点    C
10 条回复
linux40
2015-05-06 07:30:46 +08:00
知乎上有作者?
laoyur
2015-05-06 09:15:19 +08:00
貌似作者也在v2,求火力支援,@ miloyip
laoyur
2015-05-06 09:16:17 +08:00
上一条没@ 到,重发一下,@miloyip
miloyip
2015-05-06 10:13:32 +08:00
第一个没问题:

~~~cpp
TEST(Document, laoyur) {
Document doc;
doc.SetObject();

Value v(kArrayType);

doc.AddMember("array1", v, doc.GetAllocator());

StringBuffer s;
Writer<StringBuffer> writer(s);
doc.Accept(writer);

std::cout << s.GetString() << std::endl;
}
~~~

~~~
{"array1":[]}
~~~
miloyip
2015-05-06 10:17:11 +08:00
刚测了,第二个也没问题啊……

{"array1":[{"array2":[{},{}]},{"array2":[{},{}]}]}
miloyip
2015-05-06 10:19:20 +08:00
你先看看是否有其他环境原因。之后我才解释,这种调用方法不太高效,怎么改进。
laoyur
2015-05-06 11:44:31 +08:00
@miloyip 感谢作者亲临现场,👏

之所以会有问题1,是因为如果把问题2中的代码全部换成问题1中的“错误”形式后,运行时直接崩了,挂在IsObject的断言处。
考虑到问题2的奇怪表现,怀疑问题1也是因为问题2而牵连到了。

考虑环境因素的话,我环境如下:
XCode 6.2 Apple LLVM 6.0, iOS 8, cocos2dx 3.3,c++11,rapidjson版本master和1.0.1都试过
cocos2dx其实自带rapidjson,不过版本较旧,我代码中使用了github版本的rapidjson
laoyur
2015-05-06 14:49:51 +08:00
@miloyip 我重新建了个没有cocos2dx环境的工程,使用一模一样的compiler设置,问题2中的测试代码能正常运行,问题1也不复存在
miloyip
2015-05-06 16:30:31 +08:00
我不介意你把问题写在issue里,集中在一个地方,可能对其他人也会有帮助。
laoyur
2015-05-06 17:21:42 +08:00
@miloyip ok,我还会去cocoachina反映一下,看看有没有遇到相同情况的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/188604

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX