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
QJsonDocument
(QJsonDocument
other
)
可以从QJsonDocument、QJsonArray、QJsonObject中构造
QJsonDocument
(QJsonArray
array
)
QJsonDocument
(QJsonObject
object
)
QJsonDocument
()
构造空QJsonDocument
DataValidation
{ Validate, BypassValidation }
该字段告诉QJsonDocument要转化的二进制数据是否合法,即是否可以用fromBinaryData() or fromRawData()来把二进制数据转化为QJsonDocument
JsonFormat
{ Indented, Compact }
该字段定义了由QJsonDocument产生的JSON的格式(用于
toJson()
方法参数)
fromJson(QByteArray
json
, QJsonParseError *
error
= nullptr)
从一个QByteArray中进行解析,提取QJsonDocument。
失败时,返回null,且第二个参数中会包含更多细节信息。
QJsonDocument
fromVariant
(QVariant
variant
)
从一个QVariant构造一个QJsonDocument。
如果该QVariant包含除
QVariantMap
,
QVariantHash
,
QVariantList
or
QStringList
以外的类型,返回的document将是非法的
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
isArray
()
isEmpty
()
isNull
()
isObject
()
当Doc包含一个array时返回true
当Doc不含任何数据时返回true
当Doc为null时返回true
当Doc包含一个Object时返回true
QJsonObject
object
()
返回Doc中包含的QJsonObject
如果包含一个Array返回空Object
setArray
(QJsonArray
array
)
setObject
(QJsonObject
object
)
设置array为该Doc的内容
设置object为该Doc的内容
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
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。