上一节讲的都是如何将已有json文档中的数据取出利用。本节利用QJsonDocument,将其它类型的数据转化成json文档输出。
————————————
利用QJsonDocument的静态成员函数:
QJsonDocument fromVariant(const QVariant & variant)
及公有函数:
QByteArray toJson(JsonFormat format = Indented) const
————————————
JsonFormat枚举值解释如下:
Constant | Value | Description |
---|---|---|
QJsonDocument::Indented(锯齿状的)默认 | 0 | 转成易读型
|
QJsonDocument::Compact(紧凑的) | 1 | 紧凑的样子…… {"Array": [true,999,"string"],"Key": "Value","null": null} |
对于fromVariant()函数,参数的构造比较复杂;
————————————
以下是我试验成功例子:
简单部分(只使用QMap):
Qt代码:
#include "dialog.h"
#include "ui_dialog.h"
#include <QJsonDocument>
#include <QDebug>
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
//基本使用
QMap<QString, QVariant> m_map;
QMap<QString, QVariant> map1;
QMap<QString, QVariant> map2;
map1.insert("姓名","张三");
map1.insert("性别","男");
map1.insert("年龄","25");
map2.insert("姓名","小丽");
map2.insert("性别","女");
map2.insert("年龄","18");
m_map.insert("0",map1);
m_map.insert("1",map2);
QJsonDocument doc=QJsonDocument::fromVariant(QVariant(m_map));
QByteArray a=doc.toJson();
qDebug()<<a;
}
Dialog::~Dialog()
{
delete ui;
}
输出:
"{
"0": {
"姓名": "张三",
"年龄": "25",
"性别": "男"
},
"1": {
"姓名": "小丽",
"年龄": "18",
"性别": "女"
}
}
"
————————————
第二个例子,结合QMap和QList,较复杂,但有条理,将详细讲解。
从测试情况看,QMap将形成json对象,QList形成json数组。
结合下面代码及其输出,以下说明设置变量的过程:
首先,得先知道自己要输出什么样的json格式数据,见以输出的json为例。
最外层是一个对象,它只包含一个"资料列表"及它的值部分,为这个最外层对象设变量,即下面的:QMap<QString, QVariant> map1。
第二层是一个数组,它包含了两个对象,将它设为QList<QVariant> list2;
第三层即是两个对象,如,第一个对象包含了"0"与它的值。设为QMap<QString, QVariant> map3;
第四层是对象的详细信息了,设为
QMap<QString, QVariant> map4_1;
QMap<QString, QVariant> map4_2;
QMap<QString, QVariant> map4_2;
一般这一层的数据应远大于两个。可以用循环往里添加
具体的json格式灵活多变,设变量的时候,可以总结成:
从外层向内层设,遇到"{"用QMap<QString, QVariant>,遇到“[”用QList<QVariant>。
添加数据时从内层往外层,即例子中的从map4_1或map4_2开始。
讲到这里,已经十分公式化了,也许你能写出一个程序,使它自动生成输出某格式json文本的Qt代码以供使用……
Qt代码:
QMap<QString, QVariant> map1;
QList<QVariant> list2;
QMap<QString, QVariant> map3;
QMap<QString, QVariant> map4_1;
QMap<QString, QVariant> map4_2;
map4_1.insert("姓名","张三");
map4_1.insert("性别","男");
map4_1.insert("年龄","25");
map4_2.insert("姓名","小丽");
map4_2.insert("性别","女");
map4_2.insert("年龄","18");
map3.insert("0",map4_1);
map3.insert("1",map4_2);
list2.append(map3);
map1.insert("资料列表",list2);
QJsonDocument doc2=QJsonDocument::fromVariant(QVariant(map1));
QByteArray b=doc2.toJson();
qDebug()<<b;
输出:
"{
"资料列表": [
{
"0": {
"姓名": "张三",
"年龄": "25",
"性别": "男"
},
"1": {
"姓名": "小丽",
"年龄": "18",
"性别": "女"
}
}
]
}
"