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:

    {
"Array": [
true,
999,
"string"
],
"Key": "Value",
"null": null
}
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包含除QVariantMapQVariantHashQVariantList 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的关联的更多相关文章

  1. C/C++ -- Gui编程 -- Qt库的使用 -- 信号与槽的关联

    Qt信号与槽的三种关联方法:1.设计界面关联,编辑信号/槽,自动关联 2.手动关联(1).头文件中定义槽 -----mywidget.h----- #ifndef MYWIDGET_H #define ...

  2. QJsonDocument实现Qt下JSON文档读写

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QJsonDocument实现Qt下JSON文档读写     本文地址:http://tech ...

  3. Qt:QJsonObject

    0.说明 QJsonObject在逻辑上就是一个Map或Dict!记住这一点对理解它的方法.说明很有帮助. QJsonObject类封装了JSON Object. JSON Object是一个Key- ...

  4. Qt:QJsonValue

    0.说明 QJsonValue类用于操作JSON中的各种数据. JSON是用于存储结构化数据的格式,JSON中的数据可以是六种类型: 基本类型 存储类型 bool QJsonValue::Bool d ...

  5. Qt:QJsonArray

    0.说明 QJsonArray中存储了一系列的QJsonValue.可以向其中插入.删除QJsonValue. 一个QJsonArray可以与QVariantList互相转换.可以通过size()访问 ...

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

    第一种INI配置文件 .ini 文件是Initialization File的缩写,即初始化文件. 除了windows现在很多其他操作系统下面的应用软件也有.ini文件,用来配置应用软件以实现不同用户 ...

  7. QJsonObject和QJsonArray的巨坑

    最近用Qt的QJsonObject和QJsonArray当做类变量来存储运行信息,发现这两货真的是巨坑.让人有一种JJ fly的感觉/(ㄒoㄒ)/~~. 写了个例子来说明下: MainWindow:: ...

  8. QT使用QJson生成解析Json数据的方法

    QT中使用json还是比较方便的,下面用例子直接说明 举例子之前首先推荐一个在线解析json格式的网站,具体格式用法如下图所示: 之后根据这个格式进行json数据解析. QT使用json需要包含的头文 ...

  9. 【Qt编程】基于Qt的词典开发系列&lt;八&gt;--用户登录及API调用的实现

    在上一篇文章<调用网络API>中,我仅仅讲述了怎样直观的使用API接口以及调用API后返回的结果,本文则从程序实现的角度来实现API的调用.当然本程序的实现也是借助于扇贝网的API接口文档 ...

随机推荐

  1. 论文解读(DFCN)《Deep Fusion Clustering Network》

    Paper information Titile:Deep Fusion Clustering Network Authors:Wenxuan Tu, Sihang Zhou, Xinwang Liu ...

  2. Windows 10 Version 21h1安装

    好久没安装过Windows 10系统了,这两天在下载电脑管家时,使用bing搜索,没注意就选择了第一个,安装后,噩梦就来了,非法广告.各种软件的推送,怎么也清不干净. 没办法,到PCBeta下载了最新 ...

  3. C++ DLL注入工具完整源码

    先上源码 #include "Inject_Main.h" #include "resource.h" #include <Windows.h> # ...

  4. 根据指定手绘图纸照片行政区划自定义绘制对应区域边界生成geoJOSN的解决方案

    项目需求 指定某区域(非省市区县乡镇标准行政区划),做功能边界分区,实现Echarts地理坐标数据可视化展示. 提供信息 项目分析 要在Echarts上实现地理坐标可视化,必须使用geoJSON格式文 ...

  5. iconv(gb2312<->utf-8)

    转载请注明来源:https://www.cnblogs.com/hookjc/ unix下安装PHP的module,需要重新编译PHP,Windows下安装模板,只需将php.ini里的配置打开相应的 ...

  6. NSArray 遍历

    1.NSArray的下标遍历 NSArray *arr = @[p1, p2, p3, p4, p5]; for (int i = 0; i < arr.count; ++i) { Person ...

  7. mysql查询奇数行或者偶数行数据

    select * from (select @rownum := @rownum+1 as row_num, t.* from 表名 t,(select @rownum:=0) tmp_table o ...

  8. 怎么实时同步java虚拟机与操作系统时区 及JVM启动后再更改操作系统时区或时间也能保持其同步? new date() 时差8个小时的解决方案

    第一种(亲测可以) 在代码当中的Application启动类当中加入代码 @PostConstruct void started() { //时区设置:中国上海 //time.zone: " ...

  9. LeetCode随缘刷题之字符串转换整数

    package leetcode.day_01_29; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 请你 ...

  10. PlatformIO 创建 libopencm3 + FreeRTOS 项目

    PlatformIO: libopencm3 + FreeRTOS 以下步骤基于常见的 Bluepill STM32F103C8T6, 也适用于其它 libopencm3 支持的MCU型号 方案一: ...