Qt_Json文件构建与解析的简单实例

本文介绍了Qt中用于处理JSON数据的类,包括QJsonDocument、QJsonObject等,并通过一个实例展示了如何构建和解析JSON文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Qt_Json文件读写的简单实例

1、Qt文件中的Json相关类的介绍

(1)QJsonDocument

QJsonDocument类提供了一种读取和写入JSON文档的方法。

   QJsonDocument是一个包装完整JSON文档的类,它既可以从基于UTF-8编码的文本表示法,也可以从Qt自己的二进制格式中读取和写入这个文档。

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

  可以通过 !isNull() 查询解析后文档的有效性。可以使用isArray()和isObject()查询一个文档是否包含一个数组或一个对象。可以使用array()或object()检索文档中包含的数组或对象,然后进行读取或操作。

(2)QJsonObject

QJsonObject类封装了一个JSON对象。

  一个JSON对象是一个键值对的列表,其中键是唯一的字符串,而值则由QJsonValue表示。一个QJsonObject可以转换为一个QVariantMap,也可以从QVariantMap转换为QJsonObject。

  你可以用size()、insert()和remove()条目查询它的(键、值)对的数量,并使用标准的C++迭代器模式对其内容进行迭代。

  QJsonObject是一个隐式共享类,只要不被修改,它就会与它所创建的文档共享数据。你可以通过QJsonDocument将对象转换成基于文本的JSON。

(3)QJsonValue

QJsonValue类封装了JSON中的一个值。

JSON中的值可以是6种基本类型之一。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()等将值转换为存储在其中的类型。

(4)QJsonArray

QJsonArray类封装了一个JSON数组。

  JSON数组是一个值的列表。该列表可以通过从数组中插入和删除QJsonValue来操作。

  一个QJsonArray可以被转换为一个QVariantList。你可以使用size()、insert()和remove()来查询它的条目数,并使用标准的C++迭代器模式对其内容进行迭代。

  QJsonArray是一个隐式共享类,只要不被修改,它就会与它所创建的文档共享数据。你可以通过QJsonDocument将数组转换成基于文本的JSON。

2、一个简单实例

//test.json
{
    "num": [
        1,
        2
    ],
    "server": {
        "IP": "192.168.1.25",
        "Port": "1234",
        "no": [
            3,
            4
        ]
    }
}

(1)构建上面的json文件

	//创建json对象
    QJsonObject obj;
    QJsonObject sub_obj;
    QJsonArray sub_array, sub_array2;
    
	//向json对象插入键值对
    sub_obj.insert("IP",QJsonValue("192.168.1.25"));
    sub_obj.insert("Port","1234");
	//向json数组插入值
    sub_array.push_back(QJsonValue(1));
    sub_array.push_back(QJsonValue(2));
    sub_array2.push_back(QJsonValue(3));
    sub_array2.push_back(QJsonValue(4));
	//向子对象插入键值对,其中值为json数组或json对象
    sub_obj.insert("no",QJsonValue(sub_array2));
    obj.insert("server",QJsonValue(sub_obj));
    obj.insert("num",QJsonValue(sub_array));

    //转换为json文件对象
    QJsonDocument doc(obj);

    //将json文件对象转换为字符串
    QByteArray data = doc.toJson();

    //写入文件
    QFile file_json("E:\\Qt_Code\\airCloud\\test.json");
    file_json.open(QIODevice::ReadWrite);
    file_json.write(data);
    //关闭文件
    file_json.close();

(2)解析上面的json文件

    //读取json文件
    QFile file2_json("E:\\Qt_Code\\airCloud\\test.json");
    file2_json.open(QIODevice::ReadWrite);
    //json文件读入字符串
    QByteArray data = file2_json.readAll();
    file2_json.close();

    //使用字符串初始化json文件对象
    QJsonDocument doc = QJsonDocument::fromJson(data);
	//判断是否是对象
    if(doc.isObject()){
    	//json文件对象转换为QJsonObject
        QJsonObject obj = doc.object();
        
        //解析对象,val是键“server”的值,是一个QJsonValue::Object
        QJsonValue val = obj.value("server");
        
        if(val.isObject()){
        	//从QJsonValue::Object转换为QJsonObject
            QJsonObject sub_obj = val.toObject();
            //取值
            QString ip = sub_obj.value("IP").toString();
            QString port = sub_obj.value("Port").toString();
            //打印调试信息
            qDebug() << ip<< port<< endl;
        }

        //解析数组
        QJsonValue val_array = obj.value("num");
		//vec_d存放解析出来的double数组
        QVector<double> vec_d;
        //判断是否是QJsonValue::Array
        if(val_array.isArray()){
        	//将QJsonValue::Array转换为QJsonArray
            QJsonArray array = val_array.toArray();
            //获取数组长度
            int nSize = array.size();
            //遍历数组将其存入vec_d
            for (int i = 0; i < nSize; ++i){
            	//检查数组元素的类型
                QJsonValue value = array.at(i);
                //如果是double则放入vec_d
                if (value.type() == QJsonValue::Double){
                vec_d.push_back(value.toDouble());
                //打印调试信息
                qDebug() << value.toDouble();
              }
            }

        }

    }

注:Qt中Json相关类的介绍来自Qt官方文档。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值