Qt读写Json格式配置文件

Posted dengyg0710

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt读写Json格式配置文件相关的知识,希望对你有一定的参考价值。

头文件DConfig.h

 1 #pragma once
 2 
 3 #include <QSettings>
 4 #include <QFile>
 5 #include <QJsonDocument>
 6 #include <QJsonObject>
 7 #include <QJsonArray>
 8 
 9 class DConfig
10 {
11 public:
12     DConfig(const QString &fileName);
13 
14     void write(const QString &key, const QVariant& value);
15     QVariant read(const QString &key, const QString &default = "");
16     bool hasParam(const QString &key);
17     QString readString(const QString &key, const QString &default = "");
18     bool readBool(const QString &key, bool default = false);
19     float readFloat(const QString &key, float default = 0.0f);
20     int readInt(const QString &key, int default = 0);
21     
22 private:
23     QJsonObject m_rootObj;
24     QString m_jsonPath;
25 };

源文件DConfig.cpp

#include "DConfig.h"

DConfig::DConfig(const QString &fileName) : m_jsonPath(fileName)
{
    QFile loadFile(m_jsonPath);
    if (!loadFile.open(QIODevice::ReadOnly))
    {
        return;
    }
    QByteArray allData = loadFile.readAll();
    loadFile.close();
    allData.remove(allData.size() - 3, 3);
    allData.remove(0, 6);
    QJsonParseError jsondError;
    QJsonDocument jsonDoc = QJsonDocument::fromJson(allData, &jsondError);
    if (jsondError.error != QJsonParseError::NoError)
    {
        return;
    }
    m_rootObj = jsonDoc.object();
}

void DConfig::write(const QString &key, const QVariant &value)
{
    m_rootObj.insert(key, value.toJsonValue());
    QJsonArray arr;
    arr.push_back(m_rootObj);
    QJsonDocument jsonDoc(arr);
    QByteArray jsonArry = jsonDoc.toJson();
    QFile file(m_jsonPath);
    if (!file.open(QIODevice::WriteOnly))
    {
        return;
    }
    file.write(jsonArry);
    file.close();
}

QVariant DConfig::read(const QString &key, const QString &default)
{
    if (hasParam(key))
    {
        QVariant subObj = m_rootObj.value(key).toVariant();
        return subObj;
    }
    return default;
}

QString DConfig::readString(const QString &key, const QString &default)
{
    if (hasParam(key))
    {
        QString subObj = m_rootObj.value(key).toString();
        return subObj;
    }
    return default;
}

bool DConfig::readBool(const QString &key, bool default)
{
    if (hasParam(key))
    {
        bool subObj = m_rootObj.value(key).toBool();
        return subObj;
    }
    return default;
}

float DConfig::readFloat(const QString &key, float default)
{
    if (hasParam(key))
    {
        float subObj = m_rootObj.value(key).toDouble();
        return subObj;
    }
    return default;
}

int DConfig::readInt(const QString &key, int default)
{
    if (hasParam(key))
    {
        int subObj = m_rootObj.value(key).toInt();
        return subObj;
    }
    return default;
}

bool DConfig::hasParam(const QString &key)
{
    return m_rootObj.contains(key);
}

 注意:由于QT保存的Json格式外部有中括号,但读取时有中括号会报错,因此需要删除,以下cpp内的代码是为了删除中括号,首尾各占3个字符

allData.remove(allData.size() - 3, 3);
allData.remove(0, 6);
而首部删除6个字符,是防止手动修改json时多出来的3个编码格式字符

以上是关于Qt读写Json格式配置文件的主要内容,如果未能解决你的问题,请参考以下文章

Qt读写三种文件,QSettings读ini配置文件,QJsonDocument读JSON文件,QDomDocument读xml文件

c++如何使用json配置文件

QT QSettings读写配置文件

QT 登录记住密码方法之一:Qt QSettings读写配置文件

读写ini配置文件(QT版本)

读写ini配置文件(QT版本)