I can set values to objects this way in the simple json-file.
Qt code:
if(file.open(QIODevice::ReadOnly)){
QJsonDocument doc = QJsonDocument::fromJson(file.readAll());
QJsonObject obj = doc.object();
obj["gender"] = "female";
doc.setObject(obj);
manager.put(request, doc.toJson());
}
Simple json file:
{
"resourceType": "Patient",
"gender": "male",
"birthDate": "2018-08-21"
}
So this code changes the value of gender to female.
But when I use bigger json where there are "objects under objects"
{
"resource": {
"resourceType": "Patient",
"id": "530f8eb0-1f0b-41b0-b94",
"text": {
"status": "generated",
"div": "<div xmlns=\"http://www.w3.org/1999/xhtml\">Teppo Testman\n <a name=\"mm\"></a>\n </div>"
},
"name": [{
"family": "Testman",
"given": [
"Teppo"
]
}],
"gender": "male",
"birthDate": "1993-02-12"
}
}
Update:
{
"resourceType": "Bundle",
"id": "17772d63-3b14-494f-8182-06b67c970550",
"meta": {
"versionId": "1",
"lastUpdated": "2018-08-15T12:08:48.036+00:00"
},
"type": "collection",
"entry": [{
"resource": {
"resourceType": "Observation",
"text": {
"status": "generated",
"div": "<div xmlns=\"http://www.w3.org/1999/xhtml\">Height\n <a name=\"mm\"></a>\n </div>"
},
"status": "final",
"code": {
"coding": [{
"system": "http://loinc.org",
"code": "8302-2",
"display": "Body height"
}]
},
"subject": {
"reference": "Patient/530f8eb0-1f0b-41b0-b94b-c25a14656645"
},
"valueQuantity": {
"value": 166,
"unit": "cm"
}
}
},
{
"resource": {
"resourceType": "Observation",
"text": {
"status": "generated",
"div": "<div xmlns=\"http://www.w3.org/1999/xhtml\">BMI\n <a name=\"mm\"></a>\n </div>"
},
"status": "final",
"code": {
"coding": [{
"system": "http://loinc.org",
"code": "39156-5",
"display": "Body mass index (BMI) [Ratio]"
}]
},
"subject": {
"reference": "Patient/530f8eb0-1f0b-41b0-b94b-c25a14656645"
},
"valueString": "23"
}
},
{
"resource": {
"resourceType": "Observation",
"text": {
"status": "generated",
"div": "<div xmlns=\"http://www.w3.org/1999/xhtml\">FEV1 [l]\n <a name=\"mm\"></a>\n </div>"
},
"status": "final",
"code": {
"coding": [{
"system": "http://loinc.org",
"code": "18759-1",
"display": "Spirometry study"
}]
},
"subject": {
"reference": "Patient/530f8eb0-1f0b-41b0-b94b-c25a14656645"
},
"valueQuantity": {
"value": 2,
"unit": "l"
}
}
},
{
"resource": {
"resourceType": "Observation",
"text": {
"status": "generated",
"div": "<div xmlns=\"http://www.w3.org/1999/xhtml\">FEV6 [l]\n <a name=\"mm\"></a>\n </div>"
},
"status": "final",
"code": {
"coding": [{
"system": "http://loinc.org",
"code": "18759-1",
"display": "Spirometry study"
}]
},
"subject": {
"reference": "Patient/530f8eb0-1f0b-41b0-b94b-c25a14656645"
},
"valueQuantity": {
"value": 2.9,
"unit": "l"
}
}
},
{
"resource": {
"resourceType": "Observation",
"text": {
"status": "generated",
"div": "<div xmlns=\"http://www.w3.org/1999/xhtml\">PEF [l/s]\n <a name=\"mm\"></a>\n </div>"
},
"status": "final",
"code": {
"coding": [{
"system": "http://loinc.org",
"code": "18759-1",
"display": "Spirometry study"
}]
},
"subject": {
"reference": "Patient/530f8eb0-1f0b-41b0-b94b-c25a14656645"
},
"valueQuantity": {
"value": 6.5,
"unit": "l/s"
}
}
},
{
"resource": {
"resourceType": "Patient",
"id": "530f8eb0-1f0b-41b0-b94b-c25a14656645",
"text": {
"status": "generated",
"div": "<div xmlns=\"http://www.w3.org/1999/xhtml\">Teppo Testman\n <a name=\"mm\"></a>\n </div>"
},
"name": [{
"family": "Testman",
"given": [
"Teppo"
]
}],
"gender": "male",
"birthDate": "1993-02-12"
}
}
]
}
I'm not able to modify the value. Is there some simple way to do that? I have been trying to find the solution with no success!
json is not a linear structure, so you have to look for it through the arbor of keys, in this case there is a gender
is the children of resource
, so first you will access resource
and then gender
as I show below:
if(file.open(QIODevice::ReadOnly)){
QJsonDocument doc = QJsonDocument::fromJson(file.readAll());
QJsonObject root = doc.object();
QJsonObject res = root["resource"].toObject();
res["gender"] = "female";
root["resource"] = res;
doc.setObject(root);
//another code
manager.put(request, doc.toJson());
}
Update:
The idea is the same, you can not access directly but you have to know the structure of the json. Although I have an observation, for example the items children of entry that is an array, the normal thing is that those children have the same structure but in your case the last one is different which is unusual.
if(file.open(QIODevice::ReadOnly)){
QJsonDocument doc = QJsonDocument::fromJson(file.readAll());
QJsonObject root = doc.object();
QJsonArray entries = root["entry"].toArray();
for(int i=0; i < entries.count(); i++){
QJsonObject obj = entries[i].toObject();
QJsonObject objs = obj["resource"].toObject();
if(objs.contains("gender")){
objs["gender"]= "female";
obj["resource"] = objs;
entries[i] = obj;
}
}
root["entry"] = entries;
doc.setObject(root);
// another process
}