使用rapidjson从json文件中获取数组数据

时间:2014-11-11 04:15:23

标签: c++ cocos2d-x-2.x rapidjson

我是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

正如所料。但现在当我尝试从这样的数组中获取数据(获取xy)时

{"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; }

任何人都可以解释我做错了什么或错过了什么吗?抱歉我的英语不好。

任何帮助都将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:7)

使用index来枚举所有数组元素是正确的,但我个人觉得它已经过时,因为引入了C ++ 11 range-for。

使用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...
}

答案 1 :(得分:5)

最后自己找到了,正确的语法是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