RapidJSON получить имя члена Value
Хотите знать, можно ли извлечь имя rapidjson::Value
прямо с него.
Например, предположим, что у нас есть следующие данные JSON:
{
"name":
[
{ /*some data*/ },
{ /*some more data*/ }
]
}
И я извлекаю из него массив "name":
rapidjson::Value& myJSONArray = document["name"];
Могу ли я получить "имя" обратно из этого Value
? Что-то вроде этого:
std::string memberName = myJSONArray.GetMemberName(); // returns "name"
2 ответа
Решение
Нет. Это невозможно, потому что массив не может быть внутри объекта. Вы можете использовать итератор.
Value::MemberIterator itr = document.FindMember("name");
string n = itr->name.GetString();
Value& v = itr->value;
Итераторы для объекта имеют
name
а также
value
характеристики
std::pair<bool, std::string> iterate_items()
{
constexpr std::string_view stringJson = R"([ {"k1": "v1"}, {"k2": "v2"}, {"k3": "v3"}, {"k4": "v4"} ])";
// Wrap input stream for rapidjson reading
rapidjson::MemoryStream memorystreamFile( stringJson.data(), stringJson.length() );
rapidjson::Document documentJson; // Create root rapidjson object
documentJson.ParseStream( memorystreamFile ); // Parse json file
if( documentJson.IsArray() == true ) // Yes, we know it is an array :)
{
for( auto const& it : documentJson.GetArray() ) // iterate array
{
if( it.IsObject() == true ) // They are all objects
{
auto const& _name = it.MemberBegin()->name; // get name
auto const& _value = it.MemberBegin()->value; // get value
std::cout << _name.GetString() << _value.GetString() << "\n"; // dump it
}
}
}
return std::pair<bool, std::string>( true, std::string() );
}