Rapidjson Iterating over and Getting Values of Complex JSON Object Members
Clash 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.
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.
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