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

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