我正在使用jsoncpp从JSON文件中读取设置。
我想有两个级联设置文件,比如MasterSettings.json
和LocalSettings.json
,其中LocalSettings是MasterSettings的子集。我想先加载MasterSettings然后再加载LocalSettings。在LocalSettings的值与MasterSettings不同的情况下,该值将覆盖MasterSettings中的值。很像CSS中的级联。
使用jsoncpp有没有优雅的方法呢?
答案 0 :(得分:8)
我将假设您的设置文件是JSON对象。
如here所示,当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];
}
}
}