我正在尝试使用nlohmann::json覆盖嵌套的json。我的json对象如下:
{
"one": 1,
"two": 2
"three": {
"three.one": 3.1
},
}
字符串
我正在尝试遍历和/或查找嵌套对象。但是,似乎没有默认支持。看起来我必须通过创建另一个循环来遍历每个子对象,或者递归地为每个子对象调用fn。
我下面的代码片段及其结果表明,只有顶层迭代才是可能的。
void findNPrintKey (json src, const std::string& key) {
auto result = src.find(key);
if (result != src.end()) {
std::cout << "Entry found for : " << result.key() << std::endl;
} else {
std::cout << "Entry not found for : " << key << std::endl ;
}
}
void enumerate () {
json j = json::parse("{ \"one\" : 1 , \"two\" : 2, \"three\" : { \"three.one\" : 3.1 } } ");
//std::cout << j.dump(4) << std::endl;
// Enumerate all keys (including sub-keys -- not working)
for (auto it=j.begin(); it!=j.end(); it++) {
std::cout << "key: " << it.key() << " : " << it.value() << std::endl;
}
// find a top-level key
findNPrintKey(j, "one");
// find a nested key
findNPrintKey(j, "three.one");
}
int main(int argc, char** argv) {
enumerate();
return 0;
}
型
和输出:
ravindrnathsMBP:utils ravindranath$ ./a.out
key: one : 1
key: three : {"three.one":3.1}
key: two : 2
Entry found for : one
Entry not found for : three.one
型
那么,是否有递归迭代可用,或者我们必须使用is_object()方法自己做这件事?
3条答案
按热度按时间gtlvzcf81#
事实上,迭代并不递归,而且(目前)还没有库函数来实现这一点。
字符串
输出为:
型
mbyulnm02#
这是从接受的答案中衍生出来的,它给你带来了额外的好处,当你“遍历”json树时,你可以拥有父键(除了迭代器之外)。
父键以列表格式提供,以便轻松地直接覆盖它们。我还提供了将该字符串列表转换为“嵌套json键”(即
json_pointer
)的方法。这是一个对象,您可以在执行nlohmann::json中内置的各种操作时直接访问k/v对。实用函数
字符串
示例实现
型
示例数据
这里是OP的示例数据,在添加了一些字段和嵌套之后:
型
lhcgjxsq3#
根据以前的答案,这是测试:
字符串
使用方法如下:
型