Get array data from json file using quickjson

I am new to rapidjson. I have test.json that contains {"points": [1,2,3,4]}

and I use the following code to get the "points" array data

 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()); 

and its result

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

as was expected. But now when I try to get data (get x and y ) from an array like this

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

An error has occurred and is thrown to the compiler:

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

Can someone explain what I did wrong or missed something? Sorry for my bad english.

Any help would be appreciated.

Thanks.

+5
source share
2 answers

Finally, I found it myself, the correct syntax would be the 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()); } 

and the way out is

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

Hope this helps .: D

+4
source

Using an index to list all elements of an array is correct, but I personally find it deprecated since the C ++ 11 range was introduced.

With C ++ 11, you can list the values ​​this way:

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

You can also list object fields the same way (if you need to):

 for(const auto& field : point.GetObject()) { field.name.GetString(); // Use field name somehow... field.value.GetDouble(); // Use field value somehow... } 
+3
source

Source: https://habr.com/ru/post/1206602/


All Articles