2014-11-11 15 views
5

Hızlı iletişimde yeniyim. I {"points": [1,2,3,4]}json dosyasından seri veriyi elde edebilirsiniz rapidjson

içeren test.json sahip ve dizi "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()); 

veri almak için aşağıdaki kodu kullanmak ve beklendiği gibi onun sonucu

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

olup.

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

kimse i ne yaptığını açıklayabilir: Ben almaya çalıştığımda Ama şimdi verileri bir hata oluştu ve derleyici attı bu

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

gibi bir diziden (x ve y olsun) yanlış ya da bir şey cevapsız mı? Kötü ingilizcem için özür dilerim.

Herhangi bir yardım için teşekkür ederiz.

Teşekkürler.

+0

ikinci json sonunda yakın ayracı eksik. – Casey

cevap

3

nihayet buldum, doğru sözdizimi belge [ "puan"] [0] [burada "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()); 
} 

ve çıkış

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

olan olur Umarım yardımcı olur. : D

1

Tüm dizi öğelerini sıralamak için dizin kullanmak doğrudur, ancak ben C++ 11 range-for kullanılmaya başlandığından beri bunu geçersiz buluyorum. Ile

C++ 11 değerleri bu şekilde numaralandırabilmesidir: (eğer gerekirse)

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

Ayrıca nesnenin alanları aynı şekilde numaralandırabilmesidir:

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