Библиотека 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 11

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

Если вы хотите получить доступ к нему с помощью скобок, то вы можете использовать следующее:

int i=0;
cout<<"Key VALUE:"<<variable["first"]["next"][i]["key"].GetString()<<endl ;

Вывод: значение ключа: important_value

Это сработало для меня.