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() );
}

Учебник по RapidJSON

Другие вопросы по тегам