c ++ nlohmann json — как перебрать / найти вложенный объект

Я пытаюсь перебрать вложенный json, используя nlohmann :: 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 ()?

4

Решение

Действительно, итерация не повторяется, и для этого пока нет библиотечной функции. Как насчет:

#include "json.hpp"#include <iostream>

using json = nlohmann::json;

template<class UnaryFunction>
void recursive_iterate(const json& j, UnaryFunction f)
{
for(auto it = j.begin(); it != j.end(); ++it)
{
if (it->is_structured())
{
recursive_iterate(*it, f);
}
else
{
f(it);
}
}
}

int main()
{
json j = {{"one", 1}, {"two", 2}, {"three", {"three.one", 3.1}}};
recursive_iterate(j, [](json::const_iterator it){
std::cout << *it << std::endl;
});
}

Выход:

1
"three.one"3.1
2
6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]