qtjson文件修改怎么做?qt如何读写json文件?

在实际工作中,我们会使用qt修改json文件,JSON)是一种轻量级的数据交换格式,而qt 对于解析和修改json 的支持是挺不错的,那qtjson文件修改怎么做?下面来我们就来给大家讲解一下。

先看一个json:

{
    "A":
    {
        "AA": 11
    }
    , "B": [
    {
        "BB": ["bbb"]
    }]
    , "C":
    {
        "CC": ["ccc"]
    }
}

首先是一个大的json对象,以下包含了一个小的对象A,一个数组对象数组B,对象数组C

先将他们解析出来

QByteArray byte;
QFile file(file_path);
if (file.exists())
{
    file.open(QIODevice::ReadOnly | QIODevice::Text);
    byte = file.readAll();
    file.close();
}
else
{
    cout << "openFileError" << endl;; < p = "" >
}
QJsonParseError json_error;
QJsonDocument jsonDoc(QJsondocument::fromJson(byte, & json_error));
if (json_error != QJsonParseError::NoError)
{
    cout << " json error " << endl; < p = "" >
}
QJsonObject rootobj = jsonDoc.object();
//一般需要使用 rootobj.contains(xxx) 判断一下是否存在 这里我们就默认是存在的 。
QJsonObject A_obj = rootobj.value("A")
    .toObject();
A_obj["AA"] = 33;
QJsonArray B_array = rootobj.value("B")
    .toArray();
QJsonObject B_Subobj = B_array[0].toObject();
QJsonArray b_array = B_Subobj.value("BB")
    .toArray();
b_array.replace(0, "BBB");
B_Subobj["BB"] = b_array;
B_array.replace(0, B_Subobj);
QJsonObject C_obj = rootobj.value("C")
    .toObject();
QJsonArray c_array = C_obj.value("CC")
    .toArray();
c_array.replace(0, "CCC");
C_obj["CC"] = c_array;
rootobj["A"] = A_obj;
rootobj["B"] = B_array;
rootobj["C"] = C_obj;
QFile file(file_path);
if (file.exists())
{
    file.open(QIODevice::WriteOnly | QIODevice::Text);
    jsonDoc.setObject(rootobj);
    file.seek(0);
    file.write(jsonDoc.toJson());
    file.flush();
    file.close();
}

由此就将json修改完成:

{
    "A":
    {
        "AA": 33
    }
    , "B": [
    {
        "BB": ["BBB"]
    }]
    , "C":
    {
        "CC": ["CCC"]
    }
}

qt如何读写json文件?

1、QJsonDocument

详细说明

QJsonDocument类提供了读写JSON文档的方法。

QJsonDocument是一个封装了完整JSON文档的类,可以从基于UTF-8编码的文本或者Qt的二进制格式读写此文档。

可以使用QJsonDocument :: fromJson()将JSON文档从其基于文本的表示转换为QJsonDocument。 toJson()将其转换回文本。 解析器非常快速有效,并将JSON转换为Qt使用的二进制表示。

可以使用!isNull()查询已解析文档的有效性

可以使用isArray()和isObject()查询文档是否包含数组或对象。 可以使用array()或object()检索文档中包含的数组或对象,然后进行读取或操作。

还可以使用fromBinaryData()或fromRawData()从存储的二进制表示创建文档。

2、QJsonArray

详细说明

QJsonArray 类封装了一个 JSON 数组。

JSON 数组是值的列表。列表可以被操作,通过从数组中插入和删除 QJsonValue 。

一个 QJsonArray 可以和一个 QVariantList 相互转换。可以使用 size() 来查询条目的数量,通过 insert() 在指定索引处插入值,removeAt() 来删除指定索引的值。支持标准C++的迭代器。

QJsonArray是一个隐式共享类,只要它没有被修改,就会与创建它的文档共享数据。

QJsonArray对象和基于文本的JSON可以通过QJsonDocument进行相互转换。

3、QJsonObject

详细说明

QJsonObject 类封装了一个 JSON 对象。

一个 JSON 对象是一个“key/value 对”列表,key 是独一无二的字符串,value 由一个 QJsonValue 表示。

一个 QJsonObject 可以和一个 QVariantMap 相互转换。可以使用 size() 来查询“key/value 对”的数量,通过 insert() 插入“key/value 对”, remove() 删除指定的 key。

QJsonObject是一个隐式共享类,只要它没有被修改,就会与创建它的文档共享数据。

QJsonObject对象和基于文本的JSON可以通过QJsonDocument进行相互转换。

4、QJsonParseError

详细说明

QJsonParseError 类用于在 JSON 解析中报告错误。

5、QJsonValue

详细说明

QJsonValue 类封装了一个值。

JSON 中的值有 6 种基本数据类型:

bool(QJsonValue::Bool)

double(QJsonValue::Double)

string(QJsonValue::String)

array(QJsonValue::Array)

object(QJsonValue::Object)

null(QJsonValue::Null)

一个值可以由任何上述数据类型表示。此外,QJsonValue 有一个特殊的标记来表示未定义的值,可以使用 isUndefined() 查询。

值的类型可以通过 type() 或 isBool()、isString() 等访问函数查询。同样地,值可以通过 toBool()、toString() 等函数转化成相应的存储类型。

与QVariant相反,不会尝试进行任何隐式类型转换。 这意味着转换为未存储在值中的类型将返回默认的构造返回值。

6、实例

生产一下Json文档:

{
    "heartData": [
        
        {
            "I1":
            {
                "quality": 18.2
                , "temp": 25
            }
},
        
        {
            "I2":
            {
                "quality": 2000
                , "temp": 20
            }
},
        
        {
            "RO Rejection":
            {
                "value": 98
            }
},
        
        {
            "TOC":
            {
                "value": 3
            }
}
        
]
}

生产代码:

void DJson::clearJsonObject(QJsonObject & object)
{
    QStringList strList = object.keys();
    for (int i = 0; i < strList.size(); ++i)
    {
        object.remove(strList.at(i));
    }
}
void DJson::createJsonFile(const QString & fileName)
{
    QJsonArray jsonArray;
    QJsonObject rootObject;
    QJsonObject branchObject;
    QJsonObject leafObject;
    leafObject.insert("quality", 18.2);
    leafObject.insert("temp", 25.0);
    branchObject.insert("I1", leafObject);
    jsonArray.append(branchObject);
    clearJsonObject(leafObject);
    clearJsonObject(branchObject);
    leafObject.insert("quality", 2000);
    leafObject.insert("temp", 20.0);
    branchObject.insert("I2", leafObject);
    jsonArray.append(branchObject);
    clearJsonObject(leafObject);
    clearJsonObject(branchObject);
    leafObject.insert("value", 98);
    branchObject.insert("RO Rejection", leafObject);
    jsonArray.append(branchObject);
    clearJsonObject(leafObject);
    clearJsonObject(branchObject);
    leafObject.insert("value", 3);
    branchObject.insert("TOC", leafObject);
    jsonArray.append(branchObject);
    clearJsonObject(leafObject);
    clearJsonObject(branchObject);
    rootObject.insert("heartData", jsonArray);
    QJsonDocument jsonDocument;
    jsonDocument.setObject(rootObject);
    QByteArray byteArray = jsonDocument.toJson(QJsonDocument::Indented);
    QFile file(fileName);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        qDebug() << QString("fail to open the file: %1, %2, %3")
            .arg(__FILE__)
            .arg(__LINE__)
            .arg(__FUNCTION__);
        return;
    }
    QTextStream out( & file);
    out << byteArray;
    file.close();
    qDebug() << byteArray;
}

解析:

void DJson::initList()
{
    m_iList << "I1" << "I2" << "I3" << "I4" << "I5";
    m_vList << "RO Rejection" << "TOC";
}
void DJson::parseJsonFile(const QString & fileName)
{
    QFile file(fileName);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        qDebug() << QString("fail to open the file: %1, %2, %3")
            .arg(__FILE__)
            .arg(__LINE__)
            .arg(__FUNCTION__);
        return;
    }
    QByteArray array = file.readAll();
    QJsonParseError jsonParseError;
    QJsonDocument jsonDocument(QJsonDocument::fromJson(array, & jsonParseError));
    if (QJsonParseError::NoError != jsonParseError.error)
    {
        qDebug() << QString("JsonParseError: %1")
            .arg(jsonParseError.errorString());
        return;
    }
    QJsonObject rootObject = jsonDocument.object();
    if (!rootObject.keys()
        .contains("heartData"))
    {
        qDebug() << "No target value";
        return;
    }
    qDebug() << rootObject.keys();
    QJsonValue jsonValue = rootObject.value("heartData");
    if (!jsonValue.isArray())
    {
        qDebug() << "No target array";
    }
    QJsonArray jsonArray = jsonValue.toArray();
    for (auto iter = jsonArray.constBegin(); iter != jsonArray.constEnd(); ++iter)
    {
        parseJsonObject(iter);
    }
    qDebug() << rootObject.keys();
}
void DJson::parseJsonObject(QJsonArray::const_iterator iter)
{
    QJsonObject jsonObject = ( * iter)
        .toObject();
    for (int i = 0; i < m_iList.size(); ++i)
    {
        if (jsonObject.keys()
            .contains(m_iList.at(i)))
        {
            parseJsonObjectI(jsonObject);
            return;
        }
    }
    for (int i = 0; i < m_vList.size(); ++i)
    {
        if (jsonObject.keys()
            .contains(m_vList.at(i)))
        {
            parseJsonObjectV(jsonObject);
            return;
        }
    }
}
void DJson::parseJsonObjectI(QJsonObject & object)
{
    qDebug() << object.keys();
    for (int i = 0; i < object.keys()
        .size(); ++i)
    {
        QJsonValue jsonValue = object.value(object.keys()
            .at(i));
        if (jsonValue.isObject())
        {
            QJsonObject jsonObject = jsonValue.toObject();
            if (jsonObject.keys()
                .contains("quality"))
            {
                qDebug() << QString("%1 : %2")
                    .arg("quality")
                    .arg(jsonObject.value("quality")
                        .toDouble());
            }
            if (jsonObject.keys()
                .contains("temp"))
            {
                qDebug() << QString("%1 : %2")
                    .arg("temp")
                    .arg(jsonObject.value("temp")
                        .toDouble());
            }
        }
    }
    qDebug() << object.keys();
}
void DJson::parseJsonObjectV(QJsonObject & object)
{
    qDebug() << object.keys();
    for (int i = 0; i < object.keys()
        .size(); ++i)
    {
        QJsonValue jsonValue = object.value(object.keys()
            .at(i));
        if (jsonValue.isObject())
        {
            QJsonObject jsonObject = jsonValue.toObject();
            if (jsonObject.keys()
                .contains("value"))
            {
                qDebug() << QString("%1 : %2")
                    .arg("value")
                    .arg(jsonObject.value("value")
                        .toInt());
            }
        }
    }
    qDebug() << object.keys();
}

Qt读写Json是我们在工作中经常会遇到的,不过遇到这种情况大家不用慌张,按照以上的几种方法去解决就能读写json了。最后大家如果想要了解更多json相关知识,敬请关注奇Q工具网。

推荐阅读:

java垃圾回收机制原理意义是什么?如何进行回收?

java开发工具叫什么?java常用开发工具介绍

Java数据库的主键和外键是什么?数据库怎么理解?