Rapidjson Iterating over and Getting Values of Complex JSON Object Members

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP



Rapidjson Iterating over and Getting Values of Complex JSON Object Members



I have the following JSON object



"prog":[

"iUniqueID":1,
"bGroup":1,
"inFiles":[

"sFileType":"Zonal Data 1",
"bScenarioSpecific":0,
"pos":
"x1":1555,
"y1":-375,
"x2":1879,
"y2":-432

,

"sFileType":"Record File",
"bScenarioSpecific":0,
"pos":
"x1":1555,
"y1":-436,
"x2":1879,
"y2":-493


],
"outFiles":[

"sFileType":"Record File 1",
"bScenarioSpecific":1,
"pos":
"x1":2344,
"y1":-405,
"x2":2662,
"y2":-462


]
,

"iUniqueID":2,
"bGroup":1,
"inFiles":[

"sFileType":"Matrix File 1",
"bScenarioSpecific":0,
"pos":
"x1":98,
"y1":-726,
"x2":422,
"y2":-783

,

"sFileType":"Matrix File 2",
"bScenarioSpecific":0,
"pos":
"x1":98,
"y1":-787,
"x2":422,
"y2":-844


],
"outFiles":[

"sFileType":"Record File 1",
"bScenarioSpecific":1,
"pos":
"x1":887,
"y1":-966,
"x2":1205,
"y2":-1023


]

]



How can I iteratively access the x1 of objects inside "inFiles"? Or in general, how can I access the values stored in sub-array and sub-objects using rapidjson. Here is what I have so far


const Value& prog = document["prog"];

assert(prog.IsArray());

for (rapidjson::Value::ConstValueIterator itr = prog.Begin(); itr != prog.End(); ++itr)




I have tried a variety of things but my code does not compile, therefore I felt like it would need be productive to add it to the description of the issue.





please provide an Minimal, Complete, and Verifiable example and the exact compilation command and error messages you are receiving. Also, the contents of the JSON are irrelevant if the code doesn't compile.
– xaxxon
Aug 11 at 3:10






How about jq? cat f.json | jq .prog.inFiles.pos.x1
– Martin York
Aug 11 at 5:09


jq


cat f.json | jq .prog.inFiles.pos.x1




2 Answers
2



Here is a way you can iterate over the subarrays inside each array. Using ranged-for loop instead of iterator.


rapidjson::Document doc;
doc.Parse(str); //the one shown in the question


for (auto const& p : doc["prog"].GetArray())
std::cout << p["iUniqueID"].GetInt() << std::endl;
for (auto const& in : p["inFiles"].GetArray())
std::cout << in["sFileType"].GetString() << std::endl;
std::cout << in["pos"]["x1"].GetInt() << std::endl;




Hope this helps.





Thanks for helping. Now, the project is being compiled with Visual Studio 2010 so when I try the above, I get the error "cannot deduce 'auto' type (initializer required)". Any idea on how to do the same thing using iterators?
– Raymond Kalonji
Aug 12 at 13:06





Before I can edit, another person has posted the same code using iterators. You can check that.
– Sailesh D
Aug 12 at 16:32



Here is what ended up working


const Value& prog = d["prog"];
for (Value::ConstValueIterator p = prog.Begin(); p != prog.End(); ++p)
std:cout << (*p)["iUniqueID"].GetInt();
const Value& inFiles = (*p)["inFiles"];
for (Value::ConstValueIterator inFile = inFiles.Begin(); inFile != prog.End(); ++inFile)
std::cout << (*inFile)["sFileType"].GetString() << std::endl;
std::cout << (*inFile)["pos"]["x1"].GetInt() << std::endl;




The post here helped tremendously.






By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Popular posts from this blog

Firebase Auth - with Email and Password - Check user already registered

Dynamically update html content plain JS

Creating a leaderboard in HTML/JS