получить данные массива из файла json с помощью rapidjson

Я новичок в рапиджсоне. я имею test.json который содержит {"points": [1,2,3,4]}

и я использую следующий код, чтобы получить данные массива "points"

std::string fullPath = CCFileUtils::sharedFileUtils()->fullPathForFilename("json/deluxe/treasurebag.json");

unsigned long bufferSize = 0;

const char* mFileData = (const char*)CCFileUtils::sharedFileUtils()->getFileData(fullPath.c_str(), "r", &bufferSize);

std::string clearData(mFileData);
size_t pos = clearData.rfind("}");
clearData = clearData.substr(0, pos+1);
document.Parse<0>(clearData.c_str());
assert(document.HasMember("points"));

const Value& a = document["points"]; // Using a reference for consecutive access is handy and faster.
assert(a.IsArray());
for (SizeType i = 0; i < a.Size(); i++) // rapidjson uses SizeType instead of size_t.
CCLOG("a[%d] = %d\n", i, a[i].GetInt());

и его результат

Cocos2d: a[0] = 1
Cocos2d: a[1] = 2
Cocos2d: a[2] = 3
Cocos2d: a[3] = 4

как и ожидалось. Но теперь, когда я пытаюсь получить данные (получить x а также y) из массива, как это

{"points": [{"y": -14.25,"x": -2.25},{"y": -13.25,"x": -5.75},{"y": -12.5,"x": -7.25}]}

произошла ошибка и выбросил в компилятор:

//! Get the number of elements in array.
SizeType Size() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size; }

Кто-нибудь может объяснить, что я сделал не так или что-то упустил? Извините за мой плохой английский.

Любая помощь будет оценена.

Благодарю.

7

Решение

Наконец-то сам нашел, правильный синтаксис: document [«points»] [0] [«x»]. GetString ()

for (SizeType i = 0; i < document["points"].Size(); i++){
CCLOG("{x=%f, y=%f}", document["points"][i]["x"].GetDouble(), document["points"][i]["y"].GetDouble());
}

и вывод

Cocos2d: {x=-2.250000, y=-14.250000}
Cocos2d: {x=-5.750000, y=-13.250000}
Cocos2d: {x=-7.250000, y=-12.500000}

Надеюсь, поможет. : D

4

Другие решения

Использование индекса для перечисления всех элементов массива является правильным, но я лично считаю его устаревшим с тех пор, как был представлен диапазон C ++ 11.

С C ++ 11 вы можете перечислять значения следующим образом:

for(const auto& point : document["points"].GetArray()){
CCLOG("{x=%f, y=%f}", point["x"].GetDouble(), point["y"].GetDouble());
}

Вы также можете перечислить поля объекта таким же образом (если вам нужно):

for(const auto& field : point.GetObject()) {
field.name.GetString(); // Use field's name somehow...
field.value.GetDouble(); // Use field's value somehow...
}
4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector