Более быстрая альтернатива JsonCpp, которая позволяет копировать/изменять объекты Json?

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.

Любая альтернатива? Бонусный балл за бенчмарки.


person Vittorio Romeo    schedule 06.07.2013    source источник
comment
Вы хотите сохранить JSON или сделать все в порядке, чтобы перевести текст JSON в структуры C++.   -  person Martin York    schedule 06.07.2013
comment
Будет ли это работать для вас: pastebin.com/LwH92T3w   -  person Martin York    schedule 06.07.2013
comment
@LokiAstari Я хочу хранить объекты JSON, как это делает jsoncpp   -  person Vittorio Romeo    schedule 06.07.2013
comment
Вы можете ознакомиться с C++ API в JPJson, который является ядром API Objective-C. Он может генерировать представление со стандартными контейнерами и в основном поддерживает запрошенный вами синтаксис. Это также довольно быстро - сравнимо с rapidjson.   -  person CouchDeveloper    schedule 10.07.2013


Ответы (1)


После некоторого поиска «документации» я наконец нашел хороший способ копирования объектов JSON с помощью rapidjson, который очень удобен:

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())

У явного копирования есть одно преимущество: оно заставляет вас четко понимать, когда вы используете ссылки или потенциально ненужные копии.

person grundprinzip    schedule 26.10.2013
comment
При компиляции возникает много ошибок C2248, множество элементов внутри функции Accept говорят одно и то же сообщение: cannot access private member declared in class 'rapidjson::GenericDocument<Enconding>'. Я использую doc.Accept(other.doc) в конструкторе копирования. Вы знаете, как решить эту проблему? - person SysDragon; 28.03.2014
comment
Недавно в Rapidjson был добавлен API глубокого копирования. github.com/miloyip/rapidjson/pull/20 - person Milo Yip; 30.06.2014