Библиотека RapidJSON получение значения внутри массива по его индексу
{"hi": "hellow",
"first":
{"next":[
{"key":"important_value"}
]
}
}
Доступ к RapidJSON внутри массива:
Это работает: cout << "HI VALUE:" << variable["hi"].GetString() << endl;
это выведет: hellow
как и ожидалось, проблема заключается в доступе к внутренним значениям, например, если я хочу получить "Important_Value", я попробовал что-то вроде этого: cout << "Key VALUE:" << variable["first"]["next"][0]["key"].GetString() << endl ;
но это не работает, я хочу иметь возможность получить" important_value " по первому элементу массива, и в этом случае это [0]
, что вызывает ошибку.
Как мне получить его по индексу? Надеюсь, мое объяснение вам понятно.
Спасибо в продвижение.
4 ответа:
JSON
{"hi": "hellow", "first": {"next":[{"key":"important_value"} ] } }
Код:
rapidjson::Document document; if (document.Parse<0>(json).HasParseError() == false) { const Value& a = document["first"]; const Value& b = a["next"]; // rapidjson uses SizeType instead of size_t. for (rapidjson::SizeType i = 0; i < b.Size(); i++) { const Value& c = b[i]; printf("%s \n",c["key"].GetString()); } }
Выведет important_value
[обновление]
Благодаря умной работе участников RapidJSON теперь может вывести литерал
0
из строки. Так что проблема больше не возникает.Https://github.com/miloyip/rapidjson/issues/167
Проблема, как указал mjean, компилятор не может определить, должен ли он вызывать метод доступа к элементу объекта или метод доступа к элементу массива, используя литерал
0
:GenericValue& operator[](const Ch* name) GenericValue& operator[](SizeType index)
С помощью
[0u]
или[SizeType(0)]
можно обойти эту проблему.Еще один способ справиться с этой проблемой можно, остановив использование перегруженной версии для оператора[]. Например, использование
operator()
для одного типа доступа. Или используя обычные функции, напримерGetMember()
,GetElement()
. Но сейчас у меня нет предпочтений по этому поводу. Другие предложения приветствуются.
Я заметил это в учебнике.cpp-файл;
// Note: //int x = a[0].GetInt(); // Error: operator[ is ambiguous, as 0 also mean a null pointer of const char* type. int y = a[SizeType(0)].GetInt(); // Cast to SizeType will work. int z = a[0u].GetInt(); // This works too.
Я не проверял его, но вы можете попробовать один из них;
Переменная ["first"] ["next"] [0u] ["key"].GetString ()
Переменная ["first"] ["next"] [SizeType(0)] ["key"].GetString ()