c ++, анализ массива JSON с использованием nlohmann :: json - PullRequest
0 голосов
/ 15 ноября 2018

В файле json, импортированном в мою программу на c ++, есть такая структура:

{
 "a":"1",
 "ec":[
       {
        "a":"0x00",
        "s":[
             {"a":"0xA0"},
             {"a":"0xA1"},
            ],
        "b":"v1"
       },
       {
        "a":"0x01",
        "s":[
             {"a":"0xB0"},
             {"a":"0xB1"},
            ],
        "b":"v2"
       }
      ]
}

Я хочу перебрать массив "ec" и получить значения всех "a" и для каждого "a" то же самое для его s массива

vector<string> ec_a; // should contain {"0x00","0x01"}
vector<string> a1_s; // should contain {"0xA0", "0xA1"}
vector<string> a2_s; // should contain {"0xB0","0xB1"}

сначала я получаю размер ec, но из документов Я понял, что для остальных нужно использовать итератор

int n=j["ec"].size() // n = 2
for(auto it=j["ec"].begin();it!=j["ec"].end();++it){
  if(it.key() == "a") ec_a.push_back(it.value());
}

но получите это исключение nlohmann::detail::invalid_iterator at memory location Я предполагаю, что j["ec"].begin() неверно.

как мне это сделать, спасибо.

1 Ответ

0 голосов
/ 22 апреля 2019

it является итератором составного типа.Составной тип сам по себе не имеет «ключа».

То, чего вы пытаетесь достичь, гораздо проще, чем вы могли подумать.Вы можете попробовать это:

std::vector<std::string> ec_a;
for (auto& elem : j["ec"])
    ec_a.push_back(elem["a"]);

(живая демонстрация)

...