头文件:
#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"
}
}
}