Как сгладить словарь в C ++ - PullRequest
0 голосов
/ 16 мая 2018

Как мне сгладить приведенный ниже словарь -

ввод:

dict = {
            "Key1" : "1",
            "Key2" : {
                "a" : "2",
                "b" : "3",
                "c" : {
                    "d" : "3",
                    "e" : {
                        "" : "1"
                    }
                }
            }
        }

вывод:

{
            "Key1" : "1",
            "Key2.a" : "2",
            "Key2.b" : "3",
            "Key2.c.d" : "3",
            "Key2.c.e" : "1"
        }

Тип данных входной карты map<string, void*> Ожидаемая выходная карта: map<string,string>

1 Ответ

0 голосов
/ 16 мая 2018

Используйте boost PropertyTree. PropertyTree может представлять иерархическую структуру и даже поставляется с небольшим парсером json. Он также имеет совместимые с std итераторы, поэтому вы можете выполнять итерацию по дереву и копировать каждый узел в выходную карту, эффективно сглаживая дерево.

Примерно так (взято из https://www.boost.org/doc/libs/1_65_1/doc/html/property_tree/tutorial.html):

namespace pt = boost::property_tree;
ptree tree;

// read the hierarchical data into the tree
pt::read_json(filename, tree);

map<string, string> out;
flatten(tree, out);

Где flatten рекурсивно перебирает дерево:

void flatten(const pt::tree &tree, map<string, string> &out)
{
   for (const auto &j:tree)
   {
      copy_to_out(j, out);
      if (is_tree(j))
         flatten(j, out);
   }
}
...