Qt对json的修改

下面,对my.json中gradename的第一个元素进行修改

 

 toObject()、toArray()都会开辟新内存,这是我们认为改了,但是没有生效的原因所在。即在新内存上改了之后,需重新赋回旧内存

核心代码:三板斧【一路to过去】【改】【一路赋回】

    // 获取根 { }
    QJsonObject rootObj = doc.object();

    //从根→grade节点,一路to过去,遇{}toObject,遇[]toArray。
    QJsonObject languagesObj=rootObj["languages"].toObject();
    QJsonObject serialOneObj=languagesObj["serialOne"].toObject();

    //to到serialOne节点,就可以改grade了
    serialOneObj["grade"]=30;

    //赋回前一个节点(一路往回赋,直到根)
    languagesObj["serialOne"]=serialOneObj;
    rootObj["languages"]=languagesObj;

    // 将object设置为本文档的主要对象
    doc.setObject(rootObj);

同理,改name的第一个元素

    // 获取根 { }
    QJsonObject rootObj = doc.object();

    //从根→name节点,一路to过去,遇{}toObject,遇[]toArray。
    QJsonObject languagesObj=rootObj["languages"].toObject();
    QJsonObject serialOneObj=languagesObj["serialOne"].toObject();
    QJsonArray nameArray= serialOneObj["name"].toArray();
    
    //to到name节点,才可以改其中元素
    nameArray[0]="法语";
    
    //赋回前一个节点(一直往回赋,直到根)
    serialOneObj["name"]=nameArray;
    languagesObj["serialOne"]=serialOneObj;
    rootObj["languages"]=languagesObj;

    // 将object设置为本文档的主要对象
    doc.setObject(rootObj);

全部代码:

#include <QCoreApplication>
#include<QFile>

#include<QJsonDocument>
#include<QJsonObject>
#include<QJsonArray>
#include<QJsonValue>
#include<QJsonParseError>

#pragma execution_character_set("utf-8") //防止中文乱码,与 utf8带BOM 配合使用

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QFile file("my.json");
    if (!file.open(QFile::ReadOnly | QFile::Text)) {
        qDebug() << "can't open error!";
        return 0;
    }

    // 读取文件的全部内容
    QTextStream stream(&file);
    stream.setCodec("UTF-8"); // 设置读取编码是UTF8
    QString str = stream.readAll();

    file.close();


    // QJsonParseError类用于在JSON解析期间报告错误。
    QJsonParseError jsonError;
    // 将json解析为UTF-8编码的json文档,并从中创建一个QJsonDocument。
    // 如果解析成功,返回QJsonDocument对象,否则返回null
    QJsonDocument doc = QJsonDocument::fromJson(str.toUtf8(), &jsonError);
    // 判断是否解析失败
    if (jsonError.error != QJsonParseError::NoError && !doc.isNull())
    {
        qDebug() << "Json格式错误!" << jsonError.error;
        return 0;
    }

    // 获取根 { }
    QJsonObject rootObj = doc.object();

    //从根→name节点,一路to过去,遇{}toObject,遇[]toArray。
    QJsonObject languagesObj=rootObj["languages"].toObject();
    QJsonObject serialOneObj=languagesObj["serialOne"].toObject();
    QJsonArray nameArray= serialOneObj["name"].toArray();

    //to到serialOne节点,就可以改grade了
    serialOneObj["grade"]=30;
    //to到name节点,才可以改其中元素
    nameArray[0]="法语";

    //赋回前一个节点(一直往回赋,直到根)
    serialOneObj["name"]=nameArray;
    languagesObj["serialOne"]=serialOneObj;
    rootObj["languages"]=languagesObj;

    // 将object设置为本文档的主要对象
    doc.setObject(rootObj);

    // 重写打开文件,覆盖原有文件,达到删除文件全部内容的效果
    QFile writeFile("abc.json");
    if (!writeFile.open(QFile::WriteOnly | QFile::Truncate)) {
        qDebug() << "can't open error!";
        return 0;
    }

    // 将修改后的内容写入文件
    QTextStream wirteStream(&writeFile);
    wirteStream.setCodec("UTF-8");        // 设置读取编码是UTF8
    wirteStream << doc.toJson();        // 写入文件
    writeFile.close();                    // 关闭文件


    return a.exec();
}

 【更齐全的内容】

请参考此博客,也感谢作者的耐心回答! Qt 操作Json格式文件(创建、插入、解析、修改、删除)

posted @ 2023-02-27 16:22  夕西行  阅读(851)  评论(0编辑  收藏  举报