Search code examples
c++jsonc++11jsoncpprapidjson

Faster JsonCpp alternative that allows copying/mutability of Json objects?


JsonCpp is slow. And the code is pretty messy.

Is there any alternative that is faster, cleaner and supports stuff like:

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 supports code like the one above.

I've tried rapidjson, which is very fast, but unfortunately it does not support copying Json values.

Any alternative? Bonus point for benchmarks.


Solution

  • After searching for some time the "documentation" I finally found a good way to copy JSON objects with rapidjson wich is very convenient:

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

    The explicit copying has one advantage: It forces you to think clearly about when you are using references or potentially unnecessary copies.