Чтение вектора подобъекта с rapidjson - PullRequest
0 голосов
/ 28 октября 2019

Это мой JSON:

{
    "data": {
        "text": "hey stackoverflow",
        "array_1": [
            ["hello", "world", 11, 14]
        ]
    },
}

Мне удалось извлечь атрибут text следующим образом:

Код:

document.Parse(request_body);

auto& data = document["data"];

std::string text = data["text"].GetString();
printf("text: %s\n", text.c_str());

Вывод:

text: hey stackoverflow

Теперь мне нужно извлечь array_1 как std::vector<std::vector<std::any>>.

Я предполагаю, что, чтобы иметь такой тип данных, мне придется перебирать data["array_1"], используя типы quickjson длязаполнить векторы.

Проблема в том, что даже после попытки воспроизвести то, что я видел в Интернете, я все еще не могу прочитать значения внутри data["array_1"].

Код:

auto& array_1 = data["array_1"];
static const char* kTypeNames[] = { "Null", "False", "True", "Object", "Array", "String", "Number" };

for (rapidjson::Value::ConstValueIterator itr = array_1.Begin(); itr != array_1.End(); ++itr){
    printf("item\n");
    for (rapidjson::Value::ConstValueIterator itr2 = itr->Begin(); itr2 != itr->End(); ++itr2){
        printf("Type is %s\n", kTypeNames[itr->GetType()]);
    }
}

Вывод:

item
Type is Array
Type is Array
Type is Array
Type is Array

Но мне нужно иметь:

item
Type is String
Type is String
Type is Number
Type is Number

EDIT

Я вызывал GetType на неправильном итераторе..

Спасибо за помощь

1 Ответ

1 голос
/ 28 октября 2019
    printf("Type is %s\n", kTypeNames[itr2->GetType()]);

не

    printf("Type is %s\n", kTypeNames[itr->GetType()]);

вы печатаете тип item, он же ["hello", "world", 11, 14], а не элементы ["hello", "world", 11, 14] несколько раз.

В качестве альтернативы:

for (auto&& item : array_1.GetArray()) {
  printf("item\n");
  for (auto&& elem : item.GetArray()){
    printf("Type is %s\n", kTypeNames[elem.GetType()]);
  }
}

, чтобы избавиться от некоторого итерационного шума. (Требуется и rapidJson v1.1.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...