Библиотека 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]
.
Как мне сделать, чтобы получить его по индексу?
Надеюсь, это объяснит мои объяснения.
Спасибо заранее.
Ответы
Ответ 1
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
Ответ 2
[Обновление]
Благодаря умной работе разработчиков 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()
. Но сейчас у меня нет предпочтения. Другие предложения приветствуются.
Ответ 3
Я заметил это в файле tutorial.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.
Я не тестировал его, но вы можете попробовать один из них:
переменная [ "первый" ] [ "следующий" ] [0u] [ "ключ" ]. GetString()
переменная [ "первый" ] [ "следующий" ] [SizeType (0)] [ "ключ" ]. GetString()
Ответ 4
Если вы хотите получить к нему доступ с помощью скобок, вы можете использовать следующее:
int i=0;
cout<<"Key VALUE:"<<variable["first"]["next"][i]["key"].GetString()<<endl ;
Выход: ключ VALUE: important_value
Это сработало для меня.