qt写json文件

头文件:

#include <QJsonDocument>
#include <QJsonParseError>
#include <QJsonObject>
#include <QJsonArray>
//修改json配置文件
//json_valuetype:key类型(0:bool 1:int 2:float 3:string 4:数组array)
//json_objectlist:从根对象到key的string ("一级对象.二级对象....key")
//json_value:json key值
void BottomLayer_W0::Slots_ModifyJsonLocalconfig(int json_valuetype,QString json_objectlist,QString json_value)
{
    QFile *file = new QFile("/home/root/localconfig.json");
    if(!file->open(QIODevice::ReadWrite))//Note: In WriteOnly or ReadWrite mode, if the relevant file does not already exist, this function will try to create a new file before opening it.
    {
        qDebug() << "file->errorString()" << file->errorString();
        delete file;
        return ;
    }
    QJsonParseError jerr;
    QJsonDocument jdoc=QJsonDocument::fromJson(file->readAll(),&jerr);
    //file->close();
    if(jerr.error!=QJsonParseError::NoError)
    {
        qDebug() << "jerr->errorString()" << jerr.errorString();
        return ;
    }
    qDebug()<<"修改前json:"<<endl<<jdoc.toJson();


    QStringList list;
    list=json_objectlist.split(".");
    int count=list.size();
    //QString targetobject=list.last();//修改的对象...
    //qDebug() <<"修改json对象:"<<targetobject;


    //①最多10层深度(json 对象合法性检测)
    QList<QJsonObject> listobj;
    QJsonObject jrootObject=jdoc.object();
    if(!(jrootObject.contains(list[0])))
    {
        qDebug() << "root object is error...";
    }
    QJsonObject jsObject1;//目标修改对象
    if(count>1)
    {
        listobj<<jrootObject;
        jsObject1=jrootObject[list[0]].toObject();
        listobj<<jsObject1;
        for(int i=1; (i<10&&i<(count)) ;i++)
        {
            if(jsObject1.contains(list[i]))
            {
                //qDebug() << jsObject1.keys()<<"under:"<<list[i];
                if(i<9&&i<(count-1))
                {
                    jsObject1=jsObject1[list[i]].toObject();
                    listobj<<jsObject1;//一层一层的找到目标对象
                }
            }
            else
            {
                qDebug() << "object tree error...";
                return ;
            }
        }
    }
    else //就是根对象
    {
        jsObject1=jrootObject;
        listobj<<jsObject1;
    }
    //qDebug() << jsObject1.keys();//对象的子对象列表
    //qDebug() << jsObject1[list[count-1]].toString();//toBool
    //qDebug() <<listobj;//从根对象到目标对象的内容


    //②修改对象值
    QJsonValue modifyjsonvalue;
    if(json_valuetype==0)
    {
        bool booljsonvalue=true;
        if(json_value==QString("false"))
            booljsonvalue=false;
        modifyjsonvalue=QJsonValue::fromVariant(QVariant(booljsonvalue));
    }
    else if(json_valuetype==1)
        modifyjsonvalue=QJsonValue::fromVariant(QVariant(json_value.toInt()));
    else if(json_valuetype==2)
        modifyjsonvalue=QJsonValue::fromVariant(QVariant(json_value.toDouble()));
    else if(json_valuetype==3)
        modifyjsonvalue=QJsonValue::fromVariant(QVariant(json_value));
    else
    {
        qDebug() << "json_value error...";
        return ;
    }
    if(count>1)
    {
         listobj[count-1].insert(list[count-1],modifyjsonvalue);//插入目标对象键值     // listobj[count-1]等于jsObject1
        for(int i=(count-2); i>=0 ;i--)//再一层一层网上插入
        {
            modifyjsonvalue=QJsonValue::fromVariant(QVariant(listobj[i+1]));
            if(i>0)
                listobj[i].insert(list[i],modifyjsonvalue);
            else
                jrootObject.insert(list[0],modifyjsonvalue);//根对象
        }
    }
    else
    {
        jrootObject.insert(list[0],QJsonValue::fromVariant(QVariant(modifyjsonvalue)));//根对象
    }
    jdoc.setObject(jrootObject);
    qDebug()<<"修改后json:"<<endl<<jdoc.toJson();



    //③写回去原文档json文件
    QByteArray byte_array = jdoc.toJson();
    file->seek(0);
    file->write(byte_array);
    file->flush();
    qDebug() << "modify localconfig.json";
    file->close();
}

void Slots_ModifyJsonLocalconfig(int json_valuetype,QString json_objectlist,QString json_value);)被定义为槽函数,其他窗口connect该槽函数即可修改json文件。
测试代码:

emit Signals_ModifyJsonLocalconfig(3,"eth1 static config.address","192.168.0.205");

打印:

修改前json: 
"{\n    \"eth1 is static\": true,\n    \"eth1 static config\": {\n        \"address\": \"192.168.0.203\",\n        \"gateway\": \"192.168.0.1\",\n        \"netmask\": \"255.255.255.0\",\n        \"test\": {\n            \"testval\": \"121212\"\n        }\n    }\n}\n"
修改后json: 
"{\n    \"eth1 is static\": true,\n    \"eth1 static config\": {\n        \"address\": \"192.168.0.205\",\n        \"gateway\": \"192.168.0.1\",\n        \"netmask\": \"255.255.255.0\",\n        \"test\": {\n            \"testval\": \"121212\"\n        }\n    }\n}\n"
modify localconfig.json

localconfig.json文件
修改前

{
	"eth1 is static": true,
	"eth1 static config": {
		"address": "192.168.0.203",
		"netmask": "255.255.255.0",
		"gateway": "192.168.0.1",
		"test": {
			"testval": "121212"
		}
	}
}

修改后

{
	"eth1 is static": true,
	"eth1 static config": {
		"address": "192.168.0.205",
		"netmask": "255.255.255.0",
		"gateway": "192.168.0.1",
		"test": {
			"testval": "121212"
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值