Qt:QJsonDocument以及与QJsonArray、QJsonObject、QJsonValue的关联
0、说明
QJsonDocument类提供了read/write JSON文档的方法。
用QJsonDocument::fromJson()方法,可以从将一个JSON文件(或者QByteArray数据)转换为QJsonDocument,用QJsonDocument::toJson()则能起到相反的用法。在此过程中的语法解析是很高效的,并且可以将JSON转换为Qt使用的二进制数据。
可以用 !isNull()来知晓被解析文档的合法性;用isArray()、isObject()来检查这个Doc是否包含一个Array或Object。如果要提取这些Array与Object,可以通过调用array()、object()来实现,之后就能对Array、Object进行相关操作。
一个Doc也可以从一个二进制数据中提取,使用fromBinaryData()、fromRawData()。
1、模块和加载项
| Header: | #include <QJsonDocument> | 
| qmake: | QT += core | 
| Since: | Qt 5.0 | 
2、构造
| QJsonDocument(QJsonDocument other) | 可以从QJsonDocument、QJsonArray、QJsonObject中构造 | 
| QJsonDocument(QJsonArray array) | |
| QJsonDocument(QJsonObject object) | |
| QJsonDocument() | 构造空QJsonDocument | 
3、静态字段
| 类型 | 字段 | 可用数据 | 说明 | 
| enum | DataValidation | { Validate, BypassValidation } | 该字段告诉QJsonDocument要转化的二进制数据是否合法,即是否可以用fromBinaryData() or fromRawData()来把二进制数据转化为QJsonDocument | 
| enum | JsonFormat | { Indented, Compact } | 该字段定义了由QJsonDocument产生的JSON的格式(用于toJson()方法参数) | 
JsonFormat
| Constant | Value | Description | 
|---|---|---|
| QJsonDocument::Indented | 0 | Defines human readable output as follows:     { | 
| QJsonDocument::Compact | 1 | Defines a compact output as follows:     {"Array":[true,999,"string"],"Key":"Value","null":null} | 
4、静态方法
| 返回值类型 | 方法 | 说明 | 
| QJsonDocument | fromJson(QByteArray json, QJsonParseError *error = nullptr) | 从一个QByteArray中进行解析,提取QJsonDocument。 失败时,返回null,且第二个参数中会包含更多细节信息。 | 
| QJsonDocument | fromVariant(QVariant variant) | 从一个QVariant构造一个QJsonDocument。 如果该QVariant包含除QVariantMap, QVariantHash, QVariantList or QStringList以外的类型,返回的document将是非法的 | 
5、实例方法
| 返回值类型 | 方法 | 说明 | 
| QJsonDocument & bool bool QJsonValue QJsonValue | operator=(QJsonDocument other) operator!=(const QJsonDocument &other) operator==(const QJsonDocument &other) operator[](QString key) operator[](int i) | 赋值 不相等判断 相等判断 取doc[key]对应的QJsonValue,等同于调用object().value(key)。当isObject()返回false时,该方法返回的Object是Undefined类型 用doc[i]的方式访问QJsonArray中的值 | 
| QJsonArray | array() | 返回该Doc对应的QJsonArray。 如果包含Object时返回空Array | 
| bool | isArray() isEmpty() isNull() isObject() | 当Doc包含一个array时返回true 当Doc不含任何数据时返回true 当Doc为null时返回true 当Doc包含一个Object时返回true | 
| QJsonObject | object() | 返回Doc中包含的QJsonObject 如果包含一个Array返回空Object | 
| void | setArray(QJsonArray array) setObject(QJsonObject object) | 设置array为该Doc的内容 设置object为该Doc的内容 | 
| void | swap(QJsonDocument &other) | 交换两个OJsonDocument的内容 | 
| QByteArray | toJson() toJson(QJsonDocument::JsonFormat format) | 将QJsonDocument转化为indented格式,UTF-8编码的JSON文件 将QJsonDocument转化为UTF-8编码,指定格式的JSON文件 | 
| QVariant | toVariant() | 返回该QJsonDocument对应的QVariant。 当Doc为QJsonArray,返回QVariantList 当Doc为QVariantMap,返回QJsonObject | 
6、应用
1)从一个QJsonObject格式的QByteArray中,读取某个字段的数据(该数据是一个List),存入某个自定义类中:QByteArray → QJsonDocument → QJsonArray → class
有一个QByteArray,类似下边这种格式:
{"status":0,"result":[{"x":20.0,"y":120.0},{"x":30.0,"y":121.0}]}
要求
读取result字段值,得到一个QJsonArray,该array的每一项都是一个QJsonValue,提取每一项的x、y字段,存入一个QJsonObject对象中,再把所有这些QJsonObject,加上一个ID项,存入一个QJsonArray中:
①QByteArray → QJsonDocument:QJsonDocument::fromJson( QByteArray )
QJsonDocument doc = QJsonDocument::fromJson(data);//data就是上文的QByteArray
②QJsonDocument → QJsonArray(result字段对应的值是一个List):QJsonDocument.[Key].toArray()
QJsonArray resultArray = doc["result"].toArray();
③提取Array中的每一项中的x、y,存入相同数量的QJsonObject中,并为每个QJsonObject都添加一个ID字段;这些QJsonObject在生成后就加入到一个QJsonArray中
QJsonArray newArray={};
for(int i=0;i<resultArray.size();i++){
   //Array中的每一项都是一个QJsonValue,可以用toT()方法把它转化为对应的类型
    //由于这里是K-V类型,所以要提取其中的K和V,只能先转化为QJsonObject
    QJsonObject jobj = resultArray[i].toObject();
    double x = jobj["x"].toDouble();
    double y = jobj["y"].toDouble();
    int id = i;
    //用字段构建QJsonObject
    QJsonObject obj;
    obj.insert("X",x);
    obj.insert("Y",y);
    obj.insert("ID",id);
    //把QJsonObject放入QJsonArray中
    newArray.append(obj);
}
2)x,y → QJsonObject → QJsonArray(以QJsonObject为元素) → QJsonDocument → Json文件
说明:有一系列的x,y,每对x,y是一个QJsonObject的属性,用这些x,y构造QJsonObject;
再把这些QJsonObject作为QJsonArray的元素存入QJsonArray中;
将这个QJsonArray存入QJsonDocument中;
最后用Json文件保存这个QJsonDocument。
①x,y → QJsonObject:
QJsonObject obj;
obj.insert("x",x);
obj.insert("y",y);
②QJsonObject存入QJsonArray中,作为Array的一个元素:
QJsonArray newArray={};
//之前的obj语句
...
newArray.append(obj);
③QJsonArray → QJsonDocument:
QJsonDocument jsonDoc(newArray);
④QJsonDocument → Json文档:
    QFile file("C:\\Users\\Le\\Desktop\\stationavg.json");
    if(!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
        qDebug()<<"File open error!";
        return 0;
    }
    file.write(jsonDoc.toJson());
    file.flush();
    file.close();
3)有两个List,将它们存入同一个json文件中:2个List → 2个QJsonArray → QJsonObject的两项 → QJsonDocument → json文件
①List → QJsonArray
//直接用List作为参数构造QJsonArray即可
QJsonArray sedId = {7,8,9,11,12,13,14,15,17,...,95,98,101,102};
QJsonArray numberTransfer={-1,-1,-1,-1,43,30,26,29,...,4,-1,-1,61,54};
②QJsonArray → QJsonObject的一项
//每个Array作为QJsonObject的一项,一共两项
QJsonObject obj;
obj.insert("totalstation",sedId);
obj.insert("numbertransfer",numberTransfer);
③QJsonObject → QJsonDocument
QJsonDocument doc = QJsonDocument(obj);
④QJsonDocument → json文件
    QFile file("C:\\Users\\Administrator\\Desktop\\totalstation.json");
    if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){
        qDebug()<<"文件打开错误";
        return 0;
    }
    file.write(doc.toJson(QJsonDocument::Compact));//设置数据组织形式
    file.flush();
    file.close();
4)反向执行3)中的步骤,由一个json文件得到两个QList:json文档 → QJsonDoc → QJsonObject → 两个QJsonArray → 两个QList<int>
①json文档 → QJsonDocument
    QFile file("C:\\Users\\Le\\Desktop\\totalstation.json");
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){
        qDebug()<<"文件打开错误";
        return 0;
    }
    QJsonParseError * error = nullptr;
    QJsonDocument doc = QJsonDocument::fromJson(file.readAll(),error);
    if(error){
        qDebug()<<"json error";
        return 0;
    }
    file.close();
②QJsonDocument → QJsonObject
QJsonObject obj = doc.object();
③QJsonObject → 两个QJsonArray
QJsonArray sedId_JA = obj["totalstation"].toArray();
QJsonArray numberTransfer_JA = obj["numbertransfer"].toArray();
之所以要用toArray(),是因为直接用obj['key']提取到的是QJsonValue类型
④QJsonArray → QList
这里同样也需要用toInt(),因为QJsonArray中存储的也是QJsonValue类型
    QList<int> sedId={};
    QList<int> numberTransfer={};
    foreach(QJsonValue v,sedId_JA){
        sedId<<v.toInt();
    }
    foreach(QJsonValue v,numberTransfer_JA){
        numberTransfer<<v.toInt();
    }
7、QJsonArray、QJsonObject、QJsonValue、QJsonDocument之间的关系
①QJsonDocument
QJsonDocument是与Json文档/QByteArray最接近的类,由于它继承自QIODevice,所以可以用QIODevice提供的一系列读写接口函数进行Json读写。
一个QJsonDocument中只能包含一个Object或Array,可以用isArray()、isObject()来检查。检查完成后,可以用array()、object()将该QJsonDocument转换为QJsonArray或QJsonObject。
Object是指,Doc中存储了一系列的K-V对;
Array是指,Doc中存储了一个List。
方法
1)QByteArray → QJsonDocument:QJsonDocument::fromJson(QByteArray)
QJsonDocument → QByteArray:QJsonDocument::toJson()
2)QJsonDucument → QJsonArray :array()
3)QJsonDocument → QJsonObject:object()
4)为某个空Doc,填充Array数据:setArray( QJsonArray )
5)为某个空Doc,填充Object数据:setObject( QJsonObject )
②QJsonObject
一个QJsonObject从逻辑上看就是一个Map或Dict,其中存储了许多K-V对。
用size()可以知道K-V对的数量,由此可以循环访问每个K-V对。
用 [ key ]或value( key )方法提取key对应的value,这里的Value就是QJsonValue。
③QJsonArray
一个QJsonArray从逻辑上看就是一个List,实际上它与QList的用法基本相同,只是其中存储的数据都是QJsonValue。
用size()可以知道List的大小,由此可以循环访问每个元素。
用[ i ]或at( i )方法提取指定位置处的元素,这里的元素就是QJsonValue类型。
④QJsonValue
QJsonValue与我们常见的那些变量没什么不同,它只是作为QJsonObject和QJsonArray的基本元素而已,可以用toT()将一个QJsonValue转换为指定基本类型。
如果QJsonValue本身格式就是一个Map,其中存放了若干K-V对,那么可以通过toObject()把它转化为专门存放K-V对的类型——QJsonObject。
如果QJsonValue本身格式就是一个List,其中存放了若干元素,那么可以通过toArray()把它转化为逻辑上的List类型——QJsonArray。
Qt:QJsonDocument以及与QJsonArray、QJsonObject、QJsonValue的关联的更多相关文章
- C/C++ -- Gui编程 -- Qt库的使用 -- 信号与槽的关联
		Qt信号与槽的三种关联方法:1.设计界面关联,编辑信号/槽,自动关联 2.手动关联(1).头文件中定义槽 -----mywidget.h----- #ifndef MYWIDGET_H #define ... 
- QJsonDocument实现Qt下JSON文档读写
		版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QJsonDocument实现Qt下JSON文档读写 本文地址:http://tech ... 
- Qt:QJsonObject
		0.说明 QJsonObject在逻辑上就是一个Map或Dict!记住这一点对理解它的方法.说明很有帮助. QJsonObject类封装了JSON Object. JSON Object是一个Key- ... 
- Qt:QJsonValue
		0.说明 QJsonValue类用于操作JSON中的各种数据. JSON是用于存储结构化数据的格式,JSON中的数据可以是六种类型: 基本类型 存储类型 bool QJsonValue::Bool d ... 
- Qt:QJsonArray
		0.说明 QJsonArray中存储了一系列的QJsonValue.可以向其中插入.删除QJsonValue. 一个QJsonArray可以与QVariantList互相转换.可以通过size()访问 ... 
- Qt读写三种文件,QSettings读ini配置文件,QJsonDocument读JSON文件,QDomDocument读xml文件
		第一种INI配置文件 .ini 文件是Initialization File的缩写,即初始化文件. 除了windows现在很多其他操作系统下面的应用软件也有.ini文件,用来配置应用软件以实现不同用户 ... 
- QJsonObject和QJsonArray的巨坑
		最近用Qt的QJsonObject和QJsonArray当做类变量来存储运行信息,发现这两货真的是巨坑.让人有一种JJ fly的感觉/(ㄒoㄒ)/~~. 写了个例子来说明下: MainWindow:: ... 
- QT使用QJson生成解析Json数据的方法
		QT中使用json还是比较方便的,下面用例子直接说明 举例子之前首先推荐一个在线解析json格式的网站,具体格式用法如下图所示: 之后根据这个格式进行json数据解析. QT使用json需要包含的头文 ... 
- 【Qt编程】基于Qt的词典开发系列<八>--用户登录及API调用的实现
		在上一篇文章<调用网络API>中,我仅仅讲述了怎样直观的使用API接口以及调用API后返回的结果,本文则从程序实现的角度来实现API的调用.当然本程序的实现也是借助于扇贝网的API接口文档 ... 
随机推荐
- Integer缓冲区相关问题--valueOf()方法
			今天在学习过程中了解到一个现象,代码如下: Integer num1 = 100; Integer num2 = 100; System.out.println(num1==num2?true:fal ... 
- JavaScript之ES6常用新特性
			参考:https://www.jianshu.com/p/ac1787f6c50f 变量声明:const 与 let const:常量,必须初始化值 let:变量 格式:const 变量A = & ... 
- 幂等性是数学中的一个概念,表达的是N次变换与1次变换的结果相同
			幂等性是数学中的一个概念,表达的是N次变换与1次变换的结果相同 
- 「JOISC 2016 Day 1」棋盘游戏
			「JOISC 2016 Day 1」棋盘游戏 先判无解:第1,3行有连续的空格或四个角有空格. 然后可以发现有解的情况第1,3行可以在任意时间摆放. 对于某一列,若第2行放有棋子,那么显然可以把棋盘分 ... 
- 密码学之PRP/PRF转换引理
			本文将介绍密码学中的PRF.PRP等相关概念,并介绍 PRP/PRF 转换引理及其证明,希望读完本文后,你能对现代密码学中这几个基础概念有所了解. 在开始本文前,希望你有如下预备知识: 现代密码学是怎 ... 
- DOM Document.readyState 属性
			感谢原文作者:MDN 原文地址:https://developer.mozilla.org/zh-CN/docs/Web/API/Document/readyState 描述 一个document 的 ... 
- JVM学习十三 - (复习)HotSpot 虚拟机对象探秘
			对象的内存布局 在 HotSpot 虚拟机中,对象的内存布局分为以下 3 块区域: 对象头(Header) 实例数据(Instance Data) 对齐填充(Padding) 对象头 对象头记录了对象 ... 
- High ASCII字符从bat文件到dos控制台的转化问题
			背景是这样的,由于项目需要,需要用silent install的方式安装一些程序,而安装参数中有一些High ASCII字符,如ùé.通过代码,使用默认编码(ANSI,说明下,我用的是法语的系统)创建 ... 
- 测试前期API未实现时,如何写测试方法
			大家在做接口测试的时候可能经历过这种情况,开发出来接口文档后,测试人员就要开始编写接口测试的自动化代码.这时就会用到了mock server,mock server不在这里说了,百度一大堆,想怎么实现 ... 
- 直播流媒体ums
			准备工具 下载 UltrantMediaServer服务器 FlashMediaLiveEncoder测试直播工具 第一步 安装 UltrantMediaServer服务器 第二步 打开网也输入 ... 
