【问题标题】:Faster JsonCpp alternative that allows copying/mutability of Json objects?更快的 JsonCpp 替代方案,允许 Json 对象的复制/可变性?
【发布时间】:2013-07-06 01:42:07
【问题描述】:

JsonCpp 很慢。而且代码很乱。

是否有更快、更清洁并支持以下内容的替代方案:

Json::Value val, copy;
val["newMember"] = 100;
val["newMember2"] = "hello";
copy = val;
val["newMember2"] = "bye";
assert(val["newMember"] == copy["newMember"]);
assert(val["newMember2"] != copy["newMember2"]);

JsonCpp 支持上述代码。

我试过 rapidjson,它非常快,但不幸的是它不支持复制 Json 值。

还有其他选择吗?基准加分。

【问题讨论】:

  • 您想存储 JSON 还是可以将 JSON 文本转换为 C++ 结构。
  • 这对你有用吗:pastebin.com/LwH92T3w
  • @LokiAstari 我想像 jsoncpp 那样存储 JSON 对象
  • 你可以看看JPJson中的C++ API,这是它的Objective-C API的核心。它可以使用标准容器生成表示,并且基本上支持您请求的语法。它也非常快 - 与 rapidjson 相当。

标签: c++ json c++11 jsoncpp rapidjson


【解决方案1】:

在搜索“文档”一段时间后,我终于找到了一个用 rapidjson 复制 JSON 对象的好方法,非常方便:

rapidjson::Document doc; // This is the base document that you got from parsing etc
rapidjson::Value& v = doc["newMember"]; // newMember = 100

assert(v.GetInt() == 100);

rapidjson::Document copy;
doc.Accept(copy); // The accept meachnism is the same as used in parsing, but for copying

assert(copy["newMember"].GetInt() == doc["newMember"].GetInt())

显式复制有一个优点:它迫使您清楚地考虑何时使用引用或可能不必要的复制。

【讨论】:

  • 它在编译时引发了很多 C2248 错误,Accept 函数中的很多元素都说相同的消息:cannot access private member declared in class 'rapidjson::GenericDocument<Enconding>'。我在复制构造函数中使用doc.Accept(other.doc)。你知道如何解决这个问题吗?
  • 最近,一个贡献者为 rapidjson 添加了深拷贝 API。 github.com/miloyip/rapidjson/pull/20
猜你喜欢
  • 1970-01-01
  • 2017-09-16
  • 2018-12-11
  • 2012-07-05
  • 2012-01-23
  • 2013-07-13
  • 2011-02-27
  • 2010-09-22
相关资源
最近更新 更多