в nlohmann json как я могу преобразовать массив вложенных объектов в вектор вложенных структур? - PullRequest
2 голосов
/ 21 февраля 2020

Я задал этот вопрос, и ответ отлично работал для обычных (не вложенных) объектов:

[
  {
    "Name": "test",
    "Val": "test_val"
  },
  {
    "Name": "test2",
    "Val": "test_val2"
  }
]

со структурой:

struct Test {
  string Name;
  string Val;
};

Однако, когда я попытался использовать вложенные структуры, вот так:

struct Inner {
  string Name;
  string Value;
};

struct Outer {
  string Display;
  int    ID;
  Inner  Nested
};

//with json

"
[
  {
    "Display": "abcd",
    "ID": 100,
    "Nested": {
      "Name": "Test Name",
      "Value": "Test Value"
    }
  }
]
"

Это дало мне эту ошибку:

In function 'void from_json(const json&, Outer&)':
parser/run.cc:16:41: error: no matching function for call to 'nlohmann::basic_json<>::get_to(std::vector<Inner>&) const'
     j.at("Inner").get_to(p.Inner);

1 Ответ

3 голосов
/ 21 февраля 2020

Сообщение об ошибке звучит так, как будто вы написали вспомогательную функцию для Outer, но не Inner. Пока вы пишете вспомогательную функцию для каждого пользовательского типа, библиотека может обрабатывать вложенные структуры:

void from_json(const nlohmann::json& j, Inner& i) {
    j.at("Name").get_to(i.Name);
    j.at("Value").get_to(i.Value);
}

void from_json(const nlohmann::json& j, Outer& o) {
    j.at("Display").get_to(o.Display);
    j.at("ID").get_to(o.ID);
    j.at("Nested").get_to(o.Nested);
}

Тогда она работает так, как вы хотите:

auto parsed = json.get<std::vector<Outer>>();

Демонстрация : https://godbolt.org/z/pGsxxn

...