有没有一种优雅的方法来使用jsoncpp级联合并两个JSON树?

Tim*_* MB 10 c++ json jsoncpp

我正在使用jsoncpp从JSON文件中读取设置.

我想有两个级联设置文件,说MasterSettings.jsonLocalSettings.json这里LocalSettings是MasterSettings的一个子集.我想先加载MasterSettings然后再加载LocalSettings.在LocalSettings的值与MasterSettings不同的情况下,该值将覆盖MasterSettings中的值.很像CSS中的级联.

用jsoncpp有没有优雅的方法呢?

Nar*_*lei 10

我将假设您的设置文件是JSON对象.

正如所看到的在这里,当JSONCpp解析一个文件时,它会清除根节点的内容.这意味着尝试在旧文件之上解析新文件将不会保留旧数据.但是,如果将两个文件解析为单独的Json :: Value节点,则可以通过使用getMemberNames迭代第二个对象中的键来自行递归复制值.

// Recursively copy the values of b into a. Both a and b must be objects.
void update(Json::Value& a, Json::Value& b) {
    if (!a.isObject() || !b.isObject()) return;

    for (const auto& key : b.getMemberNames()) {
        if (a[key].isObject()) {
            update(a[key], b[key]);
        } else {
            a[key] = b[key];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 对于`if(a [key] .isObject()){`,对于'a`中没有的键,这将失败.引用不存在的键以"nullValue"的值实例化它,而isObject()在nullValue上返回true.这样你就可以递归调用a = null上的update,并且不会发生复制.(另外,对象类型`a [key]`不会被非对象`b [key]`覆盖.)你需要做的是`if(a [key] .type()== Json :: objectValue && b [key] .type()== Json :: objectValue){` - 只执行递归合并,否则只覆盖`a [key]`值. (3认同)