Rapidjson Итерация и получение значений сложных членов объекта JSON

У меня есть следующий объект JSON

{  
   "prog":[  
      {  
         "iUniqueID":1,
         "bGroup":1,
         "inFiles":[  
            {  
               "sFileType":"Zonal Data 1",
               "bScenarioSpecific":0,
               "pos":{  
                  "x1":1555,
                  "y1":-375,
                  "x2":1879,
                  "y2":-432
               }
            },
            {  
               "sFileType":"Record File",
               "bScenarioSpecific":0,
               "pos":{  
                  "x1":1555,
                  "y1":-436,
                  "x2":1879,
                  "y2":-493
               }
            }
         ],
         "outFiles":[  
            {  
               "sFileType":"Record File 1",
               "bScenarioSpecific":1,
               "pos":{  
                  "x1":2344,
                  "y1":-405,
                  "x2":2662,
                  "y2":-462
               }
            }
         ]
      },
      {  
         "iUniqueID":2,
         "bGroup":1,
         "inFiles":[  
            {  
               "sFileType":"Matrix File 1",
               "bScenarioSpecific":0,
               "pos":{  
                  "x1":98,
                  "y1":-726,
                  "x2":422,
                  "y2":-783
               }
            },
            {  
               "sFileType":"Matrix File 2",
               "bScenarioSpecific":0,
               "pos":{  
                  "x1":98,
                  "y1":-787,
                  "x2":422,
                  "y2":-844
               }
            }
         ],
         "outFiles":[  
            {  
               "sFileType":"Record File 1",
               "bScenarioSpecific":1,
               "pos":{  
                  "x1":887,
                  "y1":-966,
                  "x2":1205,
                  "y2":-1023
               }
            }
         ]
      }
   ]
}

Как я могу итеративно получить доступ к x1 объектов внутри «inFiles»? Или вообще, как я могу получить доступ к значениям, хранящимся в подмассиве и подобъектах, используя rapidjson. Вот что у меня есть до сих пор

const Value& prog = document["prog"];

assert(prog.IsArray());

for (rapidjson::Value::ConstValueIterator itr = prog.Begin(); itr != prog.End(); ++itr) {

}

Я пробовал разные вещи, но мой код не компилируется, поэтому мне показалось, что было бы продуктивно добавить его в описание проблемы.


person Raymond Kalonji    schedule 11.08.2018    source источник
comment
предоставьте минимальный воспроизводимый пример, а также точную команду компиляции и сообщения об ошибках, которые вы получаете. Кроме того, содержимое JSON не имеет значения, если код не компилируется.   -  person xaxxon    schedule 11.08.2018
comment
Как насчет jq? cat f.json | jq .prog[].inFiles[].pos.x1   -  person Martin York    schedule 11.08.2018


Ответы (2)


Вот как вы можете перебирать подмассивы внутри каждого массива. Использование цикла с диапазоном вместо итератора.

rapidjson::Document doc;
doc.Parse(str); //the one shown in the question


for (auto const& p : doc["prog"].GetArray()) {
    std::cout << p["iUniqueID"].GetInt() << std::endl;
    for (auto const& in : p["inFiles"].GetArray()) {
        std::cout << in["sFileType"].GetString() << std::endl;
        std::cout << in["pos"]["x1"].GetInt() << std::endl;
    }
}

Надеюсь это поможет.

person Wander3r    schedule 12.08.2018
comment
Спасибо за помощь. Теперь проект компилируется с помощью Visual Studio 2010, поэтому, когда я пытаюсь сделать это выше, я получаю сообщение об ошибке, которое не может вывести тип «авто» (требуется инициализатор). Любая идея о том, как сделать то же самое с помощью итераторов? - person Raymond Kalonji; 12.08.2018
comment
Прежде чем я смогу отредактировать, другой человек опубликовал тот же код, используя итераторы. Вы можете проверить это. - person Wander3r; 12.08.2018

Вот что в итоге заработало

const Value& prog = d["prog"];
for (Value::ConstValueIterator p = prog.Begin(); p != prog.End(); ++p) {
    std:cout << (*p)["iUniqueID"].GetInt();
    const Value& inFiles = (*p)["inFiles"];
    for (Value::ConstValueIterator inFile = inFiles.Begin(); inFile != prog.End(); ++inFile) {
        std::cout << (*inFile)["sFileType"].GetString() << std::endl;
        std::cout << (*inFile)["pos"]["x1"].GetInt() << std::endl;
    }
}

Сообщение здесь очень помогло.

person Raymond Kalonji    schedule 13.08.2018