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. 计算机/linux启动过程

    开机过程指的是从打开计算机电源直到LINUX显示用户登录画面的全过程. 分析LINUX开机过程也是深入了解LINUX核心工作原理的一个很好的途径. 计算机开机过程是一个非常复杂的过程,想真正理解透彻并 ...

  2. go 把固定长度的数字写入字节切片 (byte slice),然后从字节切片中读取到并赋值给一个变量:

    // write v := uint32(500) buf := make([]byte, 4) binary.BigEndian.PutUint32(buf, v) // read x := bin ...

  3. JVM学习十一 - (复习)性能调优

    在高性能硬件上部署程序,目前主要有两种方式: 通过 64 位 JDK 来使用大内存: 使用若干个 32 位虚拟机建立逻辑集群来利用硬件资源. 使用 64 位 JDK 管理大内存 堆内存变大后,虽然垃圾 ...

  4. VC 常用

    转载请注明来源:https://www.cnblogs.com/hookjc/ ------------------------------------------------------------ ...

  5. vue单页面应用打包后相对路径、绝对路径相关问题

    原文链接:  vue单页面应用打包后相对路径.绝对路径相关问题展开       在项目开发过程中,在部署过程中,用到了反向代理,这就要求前端代码中不能使用绝对路径.但是我们知道,一般情况下,通过web ...

  6. java中的静态变量,静态方法与静态代码块详解

    java中的类的生命周期分为装载,连接,初始化,使用,和卸载五个过程. 而静态代码在类的初始化阶段被初始化. 而非静态代码则在类的使用阶段(也就是实例化一个类的时候)才会被初始化. 静态变量 可以将静 ...

  7. Xcode全系列下载地址

    Xcode全系列下载地址,不断更新dmg 格式 下载链接:http://pan.baidu.com/s/1mgyxLP2

  8. Docker consul的容器服务更新与发现

    Docker consul的容器服务更新与发现 目录 Docker consul的容器服务更新与发现 一.Consul简介 1. 服务注册与发现 2. consul概述 3. consul的两种模式 ...

  9. Linux远程访问及控制

    Linux远程访问及控制 目录 Linux远程访问及控制 一.SSH远程管理 1. SSH远程管理概述 2. OpenSSH概述 3. 配置OpenSSH服务端 4. sshd服务的验证方式 5. 使 ...

  10. ansible-playbook实现MySQL的二进制部署

    1.ansible服务器配置 1.1 安装ansible # yum -y install ansible 1.2 配置主机清单文件 # vi /etc/ansible/hosts [local] 1 ...