简体   繁体   中英

How to modify QJsonObject

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
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM