Qt QJsonDocument以及与QJsonArray、QJsonObject、QJsonValue的关联


0、说明

  QJsonDocument类提供了read/write JSON文档的方法。

  用QJsonDocument::frJson()方法,可以从将一个JSON文件(或者QByteArray数据)转换为QJsonDocument,用QJsonDocument::toJson()则能起到相反的用法。在此过程中的语法解析是很高效的,并且可以将JSON转换为Qt使用的二进制数据。

  可以用!isNull()来知晓被解析文档的合法性;用isArray()、isObject()来检查这个Doc是否包含一个Array或Object。如果要提取这些Array与Object,可以通过调用array()、object()来实现,之后就能对Array、Object进行相关操作。

  一个Doc也可以从一个二进制数据中提取,使用frBinaryData()、frRawData()。

1、模块和加载项

Header: #include <QJsonDocument>
qmake: QT += core
Since: Qt 5.0

2、构造

QJsonDocument(QJsonDocumentother) 可以从QJsonDocument、QJsonArray、QJsonObject中构造
QJsonDocument(QJsonArrayarray)
QJsonDocument(QJsonObjectobject)
QJsonDocument() 构造空QJsonDocument

3、静态字段

类型

字段

可用数据

说明

enum DataValidation 该字段告诉QJsonDocument要转化的二进制数据是否合法,即是否可以用frBinaryData() or frRawData()来把二进制数据转化为QJsonDocument
enum JsonFormat 该字段定义了由QJsonDocument产生的JSON的格式(用于toJson()方法参数)

JsonFormat


ConstantValueDescription
QJsonDocument::Indented 0 Defines human readable output as follows:
QJsonDocument::Cpact 1 Defines a cpact output as follows:


4、静态方法

返回值类型

方法

说明

QJsonDocument frJson(QByteArrayjson, QJsonParseError *error= nullptr)

从一个QByteArray中进行解析,提取QJsonDocument。

失败时,返回null,且第二个参数中会包含更多细节信息。

QJsonDocument frVariant(QVariantvariant)

从一个QVariant构造一个QJsonDocument。

如果该QVariant包含除QVariantMap,QVariantHash,QVariantListorQStringList以外的类型,返回的document将是非法的


5、实例方法

返回值类型

方法

说明

QJsonDocument &

bool

bool

QJsonValue

QJsonValue

operator=(QJsonDocumentother)

operator!=(const QJsonDocument &other)

operator==(const QJsonDocument &other)

operator[](QStringkey)

operator[](inti)

赋值

不相等判断

相等判断

取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(QJsonArrayarray)

setObject(QJsonObjectobject)

设置array为该Doc的内容

设置object为该Doc的内容

void swap(QJsonDocument &other) 交换两个OJsonDocument的内容
QByteArray

toJson()

toJson(QJsonDocument::JsonFormatformat)

将QJsonDocument转化为indented格式,UTF8编码的JSON文件

将QJsonDocument转化为UTF8编码,指定格式的JSON文件

QVariant toVariant()

返回该QJsonDocument对应的QVariant。

当Doc为QJsonArray,返回QVariantList

当Doc为QVariantMap,返回QJsonObject


6、应用

1)从一个QJsonObject格式的QByteArray中,读取某个字段的数据(该数据是一个List),存入某个自定义类中:QByteArray → QJsonDocument → QJsonArray → class

有一个QByteArray,类似下边这种格式:

,]}

要求

读取result字段值,得到一个QJsonArray,该array的每一项都是一个QJsonValue,提取每一项的x、y字段,存入一个QJsonObject对象中,再把所有这些QJsonObject,加上一个ID项,存入一个QJsonArray中:

①QByteArray → QJsonDocument:QJsonDocument::frJson(QByteArray)

QJsonDocument doc = QJsonDocument::frJson(data);//data就是上文的QByteArray

②QJsonDocument → QJsonArray(result字段对应的值是一个List):QJsonDocument.[Key].toArray()

QJsonArray resultArray = doc["result"].toArray();

③提取Array中的每一项中的x、y,存入相同数量的QJsonObject中,并为每个QJsonObject都添加一个ID字段;这些QJsonObject在生成后就加入到一个QJsonArray中

1 QJsonArray newArray=; 2 for(int i=0;i<resultArray.size();i++)

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:

1 QJsonObject obj; 2 obj.insert("x",x); 3 obj.insert("y",y);

②QJsonObject存入QJsonArray中,作为Array的一个元素:

1 QJsonArray newArray=; 2 3 //之前的obj语句 4 ... 5 6 newArray.append(obj);

③QJsonArray → QJsonDocument:

QJsonDocument jsonDoc(newArray);

④QJsonDocument → Json文档:

1   QFile file("C:\\Users\\Le\\Desktop\\stationavg.json"); 2 if(!file.open(QIODevice::WriteOnly | QIODevice::Text)) 6 file.write(jsonDoc.toJson()); 7 file.flush(); 8 filelose();

3)有两个List,将它们存入同一个json文件中:2个List → 2个QJsonArray → QJsonObject的两项 → QJsonDocument → json文件

①List → QJsonArray

1 //直接用List作为参数构造QJsonArray即可 2 QJsonArray sedId = ; 3 QJsonArray numberTransfer=;

②QJsonArray → QJsonObject的一项

1 //每个Array作为QJsonObject的一项,一共两项 2 QJsonObject obj; 3 obj.insert("totalstation",sedId); 4 obj.insert("numbertransfer",numberTransfer);

③QJsonObject → QJsonDocument

QJsonDocument doc = QJsonDocument(obj);

④QJsonDocument → json文件

1   QFile file("C:\\Users\\Administrator\\Desktop\\totalstation.json"); 2 if(!file.open(QIODevice::WriteOnly | QIODevice::Text)) 6 file.write(doc.toJson(QJsonDocument::Cpact));//设置数据组织形式 7 file.flush(); 8 filelose();

4)反向执行3)中的步骤,由一个json文件得到两个QList:json文档 → QJsonDoc → QJsonObject → 两个QJsonArray → 两个QList<int>

①json文档 → QJsonDocument

1   QFile file("C:\\Users\\Le\\Desktop\\totalstation.json"); 2 if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) 6 7 QJsonParseError * error = nullptr; 8 QJsonDocument doc = QJsonDocument::frJson(file.readAll(),error); 9 if(error) 13 filelose();

②QJsonDocument → QJsonObject

QJsonObject obj = doc.object();

③QJsonObject → 两个QJsonArray

1 QJsonArray sedId_JA = obj["totalstation"].toArray(); 2 QJsonArray numberTransfer_JA = obj["numbertransfer"].toArray();

之所以要用toArray(),是因为直接用obj['key']提取到的是QJsonValue类型

④QJsonArray → QList

这里同样也需要用toInt(),因为QJsonArray中存储的也是QJsonValue类型

1   QList<int> sedId=; 2 QList<int> numberTransfer=; 3 4 foreach(QJsonValue v,sedId_JA) 7 foreach(QJsonValue v,numberTransfer_JA)

7、QJsonArray、QJsonObject、QJsonValue、QJsonDocument之间的关系

①QJsonDocument

QJsonDocument是与Json文档/QByteArray最接近的类,由于它继承自QIODevice,所以可以用QIODevice提供的一系列读写接口函数进行Json读写。

一个QJsonDocument中只能包含一个Object或Array,可以用isArray()、isObject()来检查。检查完成后,可以用array()、object()将该QJsonDocument转换为QJsonArray或QJsonObject。

Object是指,Doc中存储了一系列的KV对;

Array是指,Doc中存储了一个List。

方法

1)QByteArray → QJsonDocument:QJsonDocument::frJson(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,其中存储了许多KV对。

用size()可以知道KV对的数量,由此可以循环访问每个KV对。

用[ 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,其中存放了若干KV对,那么可以通过toObject()把它转化为专门存放KV对的类型——QJsonObject。

如果QJsonValue本身格式就是一个List,其中存放了若干元素,那么可以通过toArray()把它转化为逻辑上的List类型——QJsonArray。



上一篇:Qt QJsonValue

下一篇:VTK 生成MIP图像-vtkImageSlabReslice类


Qt
Copyright © 2002-2019 k262电脑网 www.k262.cn 皖ICP备2020016292号
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!QQ:251442993 热门搜索 网站地图