如何修改 QJsonObject

Posted

技术标签:

【中文标题】如何修改 QJsonObject【英文标题】:How to modify QJsonObject 【发布时间】:2018-08-15 11:27:43 【问题描述】:

我可以在简单的 json 文件中以这种方式为对象设置值。

Qt代码:

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

简单的json文件:


    "resourceType": "Patient",
    "gender": "male",
    "birthDate": "2018-08-21"

所以这段代码将性别的值更改为女性。

但是当我使用更大的 json 时,其中有“对象下的对象”


    "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"
    

更新:


    "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"
            
        
    ]

我无法修改该值。有没有一些简单的方法可以做到这一点?我一直在努力寻找解决方案,但没有成功!

【问题讨论】:

我为什么要修改json?没有正当理由这样做是不对的。 【参考方案1】:

json 不是线性结构,所以你必须通过键轴寻找它,在这种情况下有一个genderresource 的孩子,所以首先你会访问resource 然后gender 如下所示:

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

更新:

思路是一样的,不能直接访问,但要知道json的结构。尽管我有一个观察结果,例如条目的子项是一个数组,但正常情况是这些子项具有相同的结构,但在您的情况下,最后一个是不同的,这是不寻常的。

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

【讨论】:

我敢打赌你的答案是正确的,但我的问题不是很好。我试图给出我目前实际使用的 json 的简短示例。我将较长版本的 json 编辑到我的原始帖子中。我试图解决这个问题,但我仍然有问题。当json中有多次资源时是否会出现问题?所以所有的资源都是entry的children。如何选择要编辑的资源? @Lauri 您不应该删除以上内容,您应该添加作为问题的更新,因为例如,如果您删除以上内容,我的回答将毫无意义。 知道了!我很抱歉。开始编辑它,但你也为我修复了它。谢谢!

以上是关于如何修改 QJsonObject的主要内容,如果未能解决你的问题,请参考以下文章

如何修改系统表

如何修改微信链接内容

如何修改MFC窗口标题

Vbox如何修改虚拟机器的uuid?

myeclipse如何修改Web项目名称,eclipse如何修改项目名字

SQL SERVER 如何修改ID列?