2014-11-11 18 views
5

Tôi mới ở dạng rapidjson. Tôi có test.json chứa {"points": [1,2,3,4]}lấy dữ liệu mảng từ tệp json bằng cách sử dụng rapidjson

và tôi sử dụng mã sau đây để có được dữ liệu của mảng "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()); 

và kết quả của nó là

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

như mong đợi. Nhưng bây giờ khi tôi cố gắng để có được dữ liệu (được xy) từ một mảng như thế này

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

một lỗi xảy ra và ném đi trong biên dịch:

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

bất cứ ai có thể giải thích những gì tôi đã làm sai hay cái gì đó bị nhỡ? Xin lỗi vì tiếng Anh của tôi không tốt.

Mọi trợ giúp sẽ được đánh giá cao.

Cảm ơn.

+0

Các json thứ hai thiếu dấu ngoặc ôm ở cuối. – Casey

Trả lời

3

Cuối cùng tìm thấy bản thân mình, Cú pháp đúng sẽ là tài liệu [ "điểm"] [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()); 
} 

và đầu ra là

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

Hy vọng nó giúp. : D

1

Sử dụng chỉ mục để liệt kê tất cả các phần tử mảng là chính xác, nhưng cá nhân tôi thấy nó lỗi thời vì phạm vi C++ 11 đã được giới thiệu.

Với C++ 11 bạn có thể liệt kê các giá trị theo cách này:

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

Bạn cũng có thể liệt kê các lĩnh vực của đối tượng theo cùng một cách (nếu bạn cần):

for(const auto& field : point.GetObject()) { 
    field.name.GetString(); // Use field's name somehow... 
    field.value.GetDouble(); // Use field's value somehow... 
} 
Các vấn đề liên quan