qt中操作json,读取json,写入json,转换json以读取和保存SQL数据库配置文件()

qt中操作json,读取json,写入json,转换json

一、说明先要明白json是什么,json说白了就是键值对形式的数据格式,key是字符串,值可以是对象、数组、字符串、基础数据类型等,主要用于场景是,前后端数据传输,作为项目配置文件,比如web端比较流行的vue,相比于xml格式的优点是体积更轻,更简洁,单位携带数据更多等特点,现在json格式已经说是应用非常广泛了。json格式的内容中不能出现注释,不然无法解析,相比于xml可以注释,这个也可以说是个遗憾,毕竟json属于轻量级文本,但是我们可以通过一些特殊处理达到注释的要求,这样,对于文本我们也就更容易理解,比如,web前端的webpack在解析配置json文件时就针对注释做了处理。二、qt使用json说回正题,qt中我们用qjson来进行解析。首先要使用需要引入相关头文件#include <qjsondocument.h>#include <qjsonobject.h>1、读取json文件以读取下面这个文件内容为例:/* 目前只支持 (左斜杠* + *左斜杠) 作为注释,且不能交替,即注释(左斜杠* + *左斜杠)里面不能包含(左斜杠* + *左斜杠)嵌套 *//* qt要成功使用mysql:请参考:https://blog.csdn.net/IT_CREATE/article/details/119155290?spm=1001.2014.3001.5501 */{  “dataBaseDrive”:”mysql”, /* sql驱动名,当前支持mysql、sqllite */  “dataBaseNameParam”:{ /* 数据库名称设置 */    “names”:[“infosystem”, “infosystem.db”], /* 数据库名称集合 */    “useIndex”:0 /* 需要连接使用的数据库名称所在索引值,从0开始,从上面的数据库名称数组中取;本项目中请遵循mysql使用不含.db后缀名称 , sqlite 使用含.db后缀名称 */  },  “dataBaseHostName”:”localhost”, /*  mysql所在服务器ip,(sqllite不会使用)*/  “dataBasePort”:3306, /*  mysql连接端口,(sqllite不会使用) */  “dataBaseUserName”:”root”, /*  mysql连接用户名,(sqllite不会使用) */  “dataBasePassWord”:”root”, /*  mysql连接密码,(sqllite不会使用) */  “projectFirstStartLoadDefaultTableData”:true  /* 项目第一次启动是否加载默认数据,本项目的默认数据是学生表信息*/}要点就是:1)通过QFile读出文件内容,这时候是字符串,如果有注释,可以按我的代码先把注释去掉2)通过QJsonDocument::fromJson把字符串转换为QJsonDocument对象,再转变为QJsonObject 对象3)通过QJsonObject .value(“键值”)的方式,取出json中这些键对应的值#include <QDebug>#include <QFile>#include <qjsondocument.h>#include <qjsonobject.h>#include <qbytearray.h>#include <qstring.h> int main(int argc, char *argv[]){    loadSetting();} void loadSetting() {    QFile settingFile;    settingFile.setFileName(“:/setting/setting.json”);    if(settingFile.open(QFile::ReadOnly)) {        // 读取json文件的内容,当前读取的内容可能是错误的,因为json文件不能有注释,而我在json中添加了注释,所以需要把注释内容去掉        QByteArray setting = settingFile.readAll().trimmed();        // 循环删除掉注释内容        while (setting.contains(“/*”) && setting.contains(“*/”)) {            int start = setting.indexOf(“/*”); // 注释左索引(这里会返回左斜杠所在索引值)            int end = setting.indexOf(“*/”) + 1; // 注释右索引(这里会返回*所在索引值,所以我们需要+1,将索引值切换到左斜杠位置)            setting =  setting.remove(start, (end – start) + 1); // 移除 /* xxxx */ 这一块的注释内容,(结束索引-开始索引+1)是整个注释内容的长度        }        settingFile.close();        qDebug()<<“配置json文件内容:”<<QString(setting);        QJsonParseError jsonError;        QJsonDocument jsonDoc(QJsonDocument::fromJson(setting, &jsonError));        if(jsonError.error == QJsonParseError::NoError)        {            QJsonObject rootObj = jsonDoc.object();            // 下面调用toxxxx方法转换值时,传入方法的值是在没读取到相应属性时返回的默认值            QString dataBaseDrive = rootObj.value(“dataBaseDrive”).toString(UserDefineConstant::DATA_BASE_DRIVE_NAME); // 读取配置文件中sql驱动的指定            QJsonObject dataBaseNameParam = rootObj.value(“dataBaseNameParam”).toObject(QJsonObject()); // 读取配置文件中数据库名称设置参数            QJsonArray dataBaseNames = dataBaseNameParam.value(“names”).toArray(QJsonArray()); // 读取配置文件中数据库名称集合            int useIndex = dataBaseNameParam.value(“useIndex”).toInt(-1); // 读取配置文件中需要连接使用的数据库名称所在索引值            QString dataBaseName = useIndex < 0 || useIndex > dataBaseNames.size() – 1                    ? UserDefineConstant::DATA_BASE_NAME : dataBaseNames.at(useIndex).toString(UserDefineConstant::DATA_BASE_NAME); // 或取数据库名称            QString dataBaseHostName = rootObj.value(“dataBaseHostName”).toString(UserDefineConstant::DATA_BASE_HOST_NAME); // 读取配置文件中数据库连接ip地址            int dataBasePort = rootObj.value(“dataBasePort”).toInt(UserDefineConstant::DATA_BASE_PORT);  // 读取配置文件中数据库连接端口            QString dataBaseUserName = rootObj.value(“dataBaseUserName”).toString(UserDefineConstant::DATA_BASE_USER_NAME); // 读取配置文件中数据库连接用户名            QString dataBasePassWord = rootObj.value(“dataBasePassWord”).toString(UserDefineConstant::DATA_BASE_PASS_WORD); // 读取配置文件中数据库连接密码            bool projectFirstStartLoadDefaultTableData = rootObj.value(“projectFirstStartLoadDefaultTableData”).toBool(UserDefineConstant::PROJECT_FIRST_START_LOAD_DEFAULT_TABLE_DATA); // 读取配置文件中工程第一次启动是否加载默认数据            // 如果配置文件中的指定数据库既不是mysql也不是sqllite,则默认采用sqllite            if(dataBaseDrive != UserDefineConstant::SQL_DRIVE_MYSQL_NAME && dataBaseDrive != UserDefineConstant::SQL_DRIVE_SQLLITE_NAME) {                UserDefineConstant::DATA_BASE_DRIVE_NAME = UserDefineConstant::SQL_DRIVE_SQLLITE_NAME;                qDebug()<<“读取到使用数据库类型:”<<dataBaseDrive <<“不属于【mysql、sqllite】, 已切换到默认sqllite”;            } else {                UserDefineConstant::DATA_BASE_DRIVE_NAME = dataBaseDrive;                qDebug()<<“读取到使用数据库类型:”<<dataBaseDrive;            }            qDebug()<<“读取到转换后数据库配置:”                   <<“dataBaseDrive:”+dataBaseDrive                   <<“dataBaseName:”+dataBaseName                   <<“dataBaseHostName:”+dataBaseHostName                   <<“dataBasePort:”+QString::number(dataBasePort)                   <<“dataBaseUserName:”+dataBaseUserName                   <<“dataBasePassWord:”+dataBasePassWord;            UserDefineConstant::DATA_BASE_NAME = dataBaseName; // 设置连接数据库名称            // 以下数据库设置只对mysql生效            UserDefineConstant::DATA_BASE_HOST_NAME = dataBaseHostName; // 设置连接数据库ip            UserDefineConstant::DATA_BASE_PORT = dataBasePort; // 设置连接数据库端口            UserDefineConstant::DATA_BASE_USER_NAME = dataBaseUserName; // 设置连接数据库用户名            UserDefineConstant::DATA_BASE_PASS_WORD = dataBasePassWord; // 设置连接数据库密码            // 设置第一次启动是否加载默认数据(当前默认数据为学生信息)            UserDefineConstant::PROJECT_FIRST_START_LOAD_DEFAULT_TABLE_DATA = projectFirstStartLoadDefaultTableData;            qDebug()<<“读取到项目是否启动默认数据:”<<projectFirstStartLoadDefaultTableData;        } else {            qDebug() << “json error!” << jsonError.errorString();        }    }}2、写入json文件以该json文件为例:{    “logSwitchoverType”: “time_period”,    “switchoverNum”: “30”,    “switchoverTime”: “2021-08-12 17:16:36”}要点就是:1)先通过QJsonObject把需要写入json的参数先进行组装,这个有点类似于我们操作QMap;2)再通过QJsonDocument 把QJsonObject对象转换成json字符串;3)最后再将这个字符串写入到文件即可// 写入备份参数到日志备份配置json文件中void Log::writeLogParamJson(){    QDateTime nowTime = QDateTime::currentDateTime();    QString switchoverTimeStr = “”;    if(Log::logSwitchoverType == LogSwitchoverType::ALL_DAY) {        // 指定天数之后        Log::switchoverTime = nowTime.addDays(Log::switchoverNum);        switchoverTimeStr = switchoverTime.toString(“yyyy-MM-dd”);    } else if(Log::logSwitchoverType == LogSwitchoverType::TIME_PERIOD) {        // 指定秒之后        Log::switchoverTime = nowTime.addSecs(Log::switchoverNum);        switchoverTimeStr = nowTime.toString(“yyyy-MM-dd hh:mm:ss”);    }    QJsonObject jsonObject;//构建json对象json    jsonObject.insert(“logSwitchoverType”, Log::logSwitchoverTypeMap.value(Log::logSwitchoverType, “”));    jsonObject.insert(“switchoverNum”, QString::number(Log::switchoverNum));    jsonObject.insert(“switchoverTime”, switchoverTimeStr);    QJsonDocument document;    document.setObject(jsonObject);    QString jsonStr(document.toJson(QJsonDocument::Indented));    // 如果文件所在文件夹不存在则创建文件夹    QFileInfo fileInfo = QFileInfo(Log::logParamJsonFile->fileName());    QDir dir = fileInfo.absoluteDir();    if(!dir.exists()) {        dir.mkdir(dir.absolutePath());    }    if(Log::logParamJsonFile->open(QIODevice::WriteOnly | QIODevice::Text)) {        Log::logParamJsonFile->write(jsonStr.toUtf8());        Log::logParamJsonFile->flush();        Log::logParamJsonFile->close();        printSystemLog(“info”, “写入备份日志参数到”+fileInfo.absoluteFilePath()+”,成功;参数:”+jsonStr);    } else {        printSystemLog(“error”, “写入备份日志参数到”+fileInfo.absoluteFilePath()+”,失败”);    }}IT_CREATE关注————————————————版权声明:本文为CSDN博主「IT_CREATE」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/IT_CREATE/article/details/119681949

————————

qt中操作json,读取json,写入json,转换json

一、说明先要明白json是什么,json说白了就是键值对形式的数据格式,key是字符串,值可以是对象、数组、字符串、基础数据类型等,主要用于场景是,前后端数据传输,作为项目配置文件,比如web端比较流行的vue,相比于xml格式的优点是体积更轻,更简洁,单位携带数据更多等特点,现在json格式已经说是应用非常广泛了。json格式的内容中不能出现注释,不然无法解析,相比于xml可以注释,这个也可以说是个遗憾,毕竟json属于轻量级文本,但是我们可以通过一些特殊处理达到注释的要求,这样,对于文本我们也就更容易理解,比如,web前端的webpack在解析配置json文件时就针对注释做了处理。二、qt使用json说回正题,qt中我们用qjson来进行解析。首先要使用需要引入相关头文件#include <qjsondocument.h>#include <qjsonobject.h>1、读取json文件以读取下面这个文件内容为例:/* 目前只支持 (左斜杠* + *左斜杠) 作为注释,且不能交替,即注释(左斜杠* + *左斜杠)里面不能包含(左斜杠* + *左斜杠)嵌套 *//* qt要成功使用mysql:请参考:https://blog.csdn.net/IT_CREATE/article/details/119155290?spm=1001.2014.3001.5501 */{  “dataBaseDrive”:”mysql”, /* sql驱动名,当前支持mysql、sqllite */  “dataBaseNameParam”:{ /* 数据库名称设置 */    “names”:[“infosystem”, “infosystem.db”], /* 数据库名称集合 */    “useIndex”:0 /* 需要连接使用的数据库名称所在索引值,从0开始,从上面的数据库名称数组中取;本项目中请遵循mysql使用不含.db后缀名称 , sqlite 使用含.db后缀名称 */  },  “dataBaseHostName”:”localhost”, /*  mysql所在服务器ip,(sqllite不会使用)*/  “dataBasePort”:3306, /*  mysql连接端口,(sqllite不会使用) */  “dataBaseUserName”:”root”, /*  mysql连接用户名,(sqllite不会使用) */  “dataBasePassWord”:”root”, /*  mysql连接密码,(sqllite不会使用) */  “projectFirstStartLoadDefaultTableData”:true  /* 项目第一次启动是否加载默认数据,本项目的默认数据是学生表信息*/}要点就是:1)通过QFile读出文件内容,这时候是字符串,如果有注释,可以按我的代码先把注释去掉2)通过QJsonDocument::fromJson把字符串转换为QJsonDocument对象,再转变为QJsonObject 对象3)通过QJsonObject .value(“键值”)的方式,取出json中这些键对应的值#include <QDebug>#include <QFile>#include <qjsondocument.h>#include <qjsonobject.h>#include <qbytearray.h>#include <qstring.h> int main(int argc, char *argv[]){    loadSetting();} void loadSetting() {    QFile settingFile;    settingFile.setFileName(“:/setting/setting.json”);    if(settingFile.open(QFile::ReadOnly)) {        // 读取json文件的内容,当前读取的内容可能是错误的,因为json文件不能有注释,而我在json中添加了注释,所以需要把注释内容去掉        QByteArray setting = settingFile.readAll().trimmed();        // 循环删除掉注释内容        while (setting.contains(“/*”) && setting.contains(“*/”)) {            int start = setting.indexOf(“/*”); // 注释左索引(这里会返回左斜杠所在索引值)            int end = setting.indexOf(“*/”) + 1; // 注释右索引(这里会返回*所在索引值,所以我们需要+1,将索引值切换到左斜杠位置)            setting =  setting.remove(start, (end – start) + 1); // 移除 /* xxxx */ 这一块的注释内容,(结束索引-开始索引+1)是整个注释内容的长度        }        settingFile.close();        qDebug()<<“配置json文件内容:”<<QString(setting);        QJsonParseError jsonError;        QJsonDocument jsonDoc(QJsonDocument::fromJson(setting, &jsonError));        if(jsonError.error == QJsonParseError::NoError)        {            QJsonObject rootObj = jsonDoc.object();            // 下面调用toxxxx方法转换值时,传入方法的值是在没读取到相应属性时返回的默认值            QString dataBaseDrive = rootObj.value(“dataBaseDrive”).toString(UserDefineConstant::DATA_BASE_DRIVE_NAME); // 读取配置文件中sql驱动的指定            QJsonObject dataBaseNameParam = rootObj.value(“dataBaseNameParam”).toObject(QJsonObject()); // 读取配置文件中数据库名称设置参数            QJsonArray dataBaseNames = dataBaseNameParam.value(“names”).toArray(QJsonArray()); // 读取配置文件中数据库名称集合            int useIndex = dataBaseNameParam.value(“useIndex”).toInt(-1); // 读取配置文件中需要连接使用的数据库名称所在索引值            QString dataBaseName = useIndex < 0 || useIndex > dataBaseNames.size() – 1                    ? UserDefineConstant::DATA_BASE_NAME : dataBaseNames.at(useIndex).toString(UserDefineConstant::DATA_BASE_NAME); // 或取数据库名称            QString dataBaseHostName = rootObj.value(“dataBaseHostName”).toString(UserDefineConstant::DATA_BASE_HOST_NAME); // 读取配置文件中数据库连接ip地址            int dataBasePort = rootObj.value(“dataBasePort”).toInt(UserDefineConstant::DATA_BASE_PORT);  // 读取配置文件中数据库连接端口            QString dataBaseUserName = rootObj.value(“dataBaseUserName”).toString(UserDefineConstant::DATA_BASE_USER_NAME); // 读取配置文件中数据库连接用户名            QString dataBasePassWord = rootObj.value(“dataBasePassWord”).toString(UserDefineConstant::DATA_BASE_PASS_WORD); // 读取配置文件中数据库连接密码            bool projectFirstStartLoadDefaultTableData = rootObj.value(“projectFirstStartLoadDefaultTableData”).toBool(UserDefineConstant::PROJECT_FIRST_START_LOAD_DEFAULT_TABLE_DATA); // 读取配置文件中工程第一次启动是否加载默认数据            // 如果配置文件中的指定数据库既不是mysql也不是sqllite,则默认采用sqllite            if(dataBaseDrive != UserDefineConstant::SQL_DRIVE_MYSQL_NAME && dataBaseDrive != UserDefineConstant::SQL_DRIVE_SQLLITE_NAME) {                UserDefineConstant::DATA_BASE_DRIVE_NAME = UserDefineConstant::SQL_DRIVE_SQLLITE_NAME;                qDebug()<<“读取到使用数据库类型:”<<dataBaseDrive <<“不属于【mysql、sqllite】, 已切换到默认sqllite”;            } else {                UserDefineConstant::DATA_BASE_DRIVE_NAME = dataBaseDrive;                qDebug()<<“读取到使用数据库类型:”<<dataBaseDrive;            }            qDebug()<<“读取到转换后数据库配置:”                   <<“dataBaseDrive:”+dataBaseDrive                   <<“dataBaseName:”+dataBaseName                   <<“dataBaseHostName:”+dataBaseHostName                   <<“dataBasePort:”+QString::number(dataBasePort)                   <<“dataBaseUserName:”+dataBaseUserName                   <<“dataBasePassWord:”+dataBasePassWord;            UserDefineConstant::DATA_BASE_NAME = dataBaseName; // 设置连接数据库名称            // 以下数据库设置只对mysql生效            UserDefineConstant::DATA_BASE_HOST_NAME = dataBaseHostName; // 设置连接数据库ip            UserDefineConstant::DATA_BASE_PORT = dataBasePort; // 设置连接数据库端口            UserDefineConstant::DATA_BASE_USER_NAME = dataBaseUserName; // 设置连接数据库用户名            UserDefineConstant::DATA_BASE_PASS_WORD = dataBasePassWord; // 设置连接数据库密码            // 设置第一次启动是否加载默认数据(当前默认数据为学生信息)            UserDefineConstant::PROJECT_FIRST_START_LOAD_DEFAULT_TABLE_DATA = projectFirstStartLoadDefaultTableData;            qDebug()<<“读取到项目是否启动默认数据:”<<projectFirstStartLoadDefaultTableData;        } else {            qDebug() << “json error!” << jsonError.errorString();        }    }}2、写入json文件以该json文件为例:{    “logSwitchoverType”: “time_period”,    “switchoverNum”: “30”,    “switchoverTime”: “2021-08-12 17:16:36”}要点就是:1)先通过QJsonObject把需要写入json的参数先进行组装,这个有点类似于我们操作QMap;2)再通过QJsonDocument 把QJsonObject对象转换成json字符串;3)最后再将这个字符串写入到文件即可// 写入备份参数到日志备份配置json文件中void Log::writeLogParamJson(){    QDateTime nowTime = QDateTime::currentDateTime();    QString switchoverTimeStr = “”;    if(Log::logSwitchoverType == LogSwitchoverType::ALL_DAY) {        // 指定天数之后        Log::switchoverTime = nowTime.addDays(Log::switchoverNum);        switchoverTimeStr = switchoverTime.toString(“yyyy-MM-dd”);    } else if(Log::logSwitchoverType == LogSwitchoverType::TIME_PERIOD) {        // 指定秒之后        Log::switchoverTime = nowTime.addSecs(Log::switchoverNum);        switchoverTimeStr = nowTime.toString(“yyyy-MM-dd hh:mm:ss”);    }    QJsonObject jsonObject;//构建json对象json    jsonObject.insert(“logSwitchoverType”, Log::logSwitchoverTypeMap.value(Log::logSwitchoverType, “”));    jsonObject.insert(“switchoverNum”, QString::number(Log::switchoverNum));    jsonObject.insert(“switchoverTime”, switchoverTimeStr);    QJsonDocument document;    document.setObject(jsonObject);    QString jsonStr(document.toJson(QJsonDocument::Indented));    // 如果文件所在文件夹不存在则创建文件夹    QFileInfo fileInfo = QFileInfo(Log::logParamJsonFile->fileName());    QDir dir = fileInfo.absoluteDir();    if(!dir.exists()) {        dir.mkdir(dir.absolutePath());    }    if(Log::logParamJsonFile->open(QIODevice::WriteOnly | QIODevice::Text)) {        Log::logParamJsonFile->write(jsonStr.toUtf8());        Log::logParamJsonFile->flush();        Log::logParamJsonFile->close();        printSystemLog(“info”, “写入备份日志参数到”+fileInfo.absoluteFilePath()+”,成功;参数:”+jsonStr);    } else {        printSystemLog(“error”, “写入备份日志参数到”+fileInfo.absoluteFilePath()+”,失败”);    }}IT_CREATE关注————————————————版权声明:本文为CSDN博主「IT_CREATE」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/IT_CREATE/article/details/119681949