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中只能包含一个ObjectArray,可以用isArray()、isObject()来检查。检查完成后,可以用array()、object()将该QJsonDocument转换为QJsonArrayQJsonObject

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从逻辑上看就是一个MapDict,其中存储了许多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与我们常见的那些变量没什么不同,它只是作为QJsonObjectQJsonArray的基本元素而已,可以用toT()将一个QJsonValue转换为指定基本类型

如果QJsonValue本身格式就是一个Map,其中存放了若干K-V对,那么可以通过toObject()把它转化为专门存放K-V对的类型——QJsonObject

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