目录
1.Json的格式
1.1.Json数组
1.2.Json对象
2.QJson
2.1 QJsonObject
2.2 QJsonValue
2.3 QJsonArray
2.4 QJsonDocument
3.示例
3.1 写操作
3.2 读操作
1.Json的格式
Json的基本概念
Json 是一种数据格式,和语言无关,在什么语言中都可以使用 Json,Json一般处理两种任务:
- 组织数据(数据序列化),用于数据的网络传输
- 组织数据(数据序列化),写磁盘文件实现数据的持久化存储(一般以.json 作为文件后缀)
Json中主要两种数据格式:Json数组,和Json 对象
1.1.Json数组
- Json 数组使用 [] 表示,[] 里边是元素,元素和元素之间使用逗号间隔,最后一个元素后边没有逗号。
- Json支持多种数据类型,包括:整形、 浮点型、 字符串、 布尔类型、 json数组、 json对象、 空值-null。
- Json数组中的数据可以一致,也可以不一致
//数据一致
// 整形
[1,2,3,4,5]
// 字符串
["lisi", "haha", "xxx", "nihao", "robin"]
//数据不一致:
["lisi", 1, null, 1.1, "robin"]
//Json数组嵌套使用,Json数组中可以有Json数组
[
["lisi", 1, null, 1.1, "robin"],
[1,2,3,4,5],
["lisi", "haha", "xxx", "nihao", "robin"],
"lisa"
]
1.2.Json对象
- Json 对象使用 {} 来描述,每个 Json 对象中可以存储若干个元素,每一个元素对应一个键值(key:value 结构) 。
- 键值(key)必须是字符串,位于同一层级的键值不能重复(因为是通过键值取出对应的 value 值)
- value 值的类型是可选的,可根据实际需求指定,可用类型包括:整形、 浮点、 字符串、 布尔类型、 json数组、 json对象、 空值-null。
{
"Name":"lisa",
"Age":20,
//Family中的value值是一个Json对象
"Family":{
"Father":"Gol·D·Roger",
"Mother":"Portgas·D·Rouge",
"Brother":["Sabo", "Monkey D. Luffy"]
},
"IsAlive":false,
"Comment":"yyds"
}
错误案例:
// test.json
{
"name":"lisa",
"age":19
}
{
"user":"lisi",
"passwd":"123456"
}
在一个 Json 文件中只能有一个 Json 数组或者 Json 对象的根节点,不允许同时存储多个并列的根节点
2.QJson
- QJsonDocument:它封装了一个完整的 JSON 文档,并且可以从 UTF-8 编码的基于文本的表示以及 Qt 自己的二进制格式读取和写入该文档
- QJsonArray:QJsonArray是QT中的JSON 数组的类型。可以通过从数组中插入和删除 QJsonValue 来操作该列表。
- QJsonObject :QJsonObject是是QT中的Json对象类型,其中键是唯一的字符串,值由 QJsonValue 表示。
- QJsonValue:该类封装了 JSON 支持的数据类型,是key-value中的 value类型。
2.1 QJsonObject
QJsonObject 封装了 Json 中的对象,在里边可以存储多个键值对.
下面是常用的接口函数:
//构造函数
QJsonObject::QJsonObject(); // 构造空对象
//将键值对插入到json对象中
iterator QJsonObject::insert(const QString &key, const QJsonValue &value);
//删除键值对,通过key值进行删除
void QJsonObject::remove(const QString &key);
QJsonValue QJsonObject::take(const QString &key); // 返回key对应的value值
//插值键值对
iterator QJsonObject::find(const QString &key); //返回其迭代器
bool QJsonObject::contains(const QString &key) const;//判断是否存在
//获取键值对的 对数
int QJsonObject::count() const;
int QJsonObject::size() const;
int QJsonObject::length() const;
//通过key值获取value
QJsonValue QJsonObject::value(const QString &key) const; // utf8
QJsonValue QJsonObject::value(QLatin1String key) const; // 字符串不支持中文
QJsonValue QJsonObject::operator[](const QString &key) const;
QJsonValue QJsonObject::operator[](QLatin1String key) const;
//查找
iterator QJsonObject::find(const QString &key);
bool QJsonObject::contains(const QString &key) const;
遍历方式
//获取Json对象中所有的 key值,返回到QStringList中。
QStringList QJsonObject::keys() const;
QStringList通过函数at取下标获取到各个QJsonObject每个对象的key值。
示例:
//假设object对象中有很多个键值对,然后我们需要将每个键值对给取出来
QJsonObject object;
QStringList stringlist=object.keys();
for(int i=0;i<object.size();i++)
{
//第i个键值对
QString key=stringlist.at(i);
QJsonValue value=object[key];
}
2.2 QJsonValue
在 Qt 中 QJsonValue 可以封装的基础数据类型有六种(和 Json 支持的类型一致),分别为:
- 布尔类型:QJsonValue::Bool
- 浮点类型(包括整形): QJsonValue::Double
- 字符串类型: QJsonValue::String
- Json 数组类型: QJsonValue::Array
- Json 对象类型:QJsonValue::Object
- 空值类型: QJsonValue::Null
这些类型可以通过 QJsonValue 的构造函数被封装为一个类对象:
构造函数:
// Json对象
QJsonValue(const QJsonObject &o);
// Json数组
QJsonValue(const QJsonArray &a);
// 字符串
QJsonValue(const char *s);
QJsonValue(QLatin1String s);
QJsonValue(const QString &s);
// 整形 and 浮点型
QJsonValue(qint64 v);
QJsonValue(int v);
QJsonValue(double v);
// 布尔类型
QJsonValue(bool b);
// 空值类型
QJsonValue(QJsonValue::Type type = Null);
//判断类型
// 是否是Json数组
bool isArray() const;
// 是否是Json对象
bool isObject() const;
// 是否是布尔类型
bool isBool() const;
// 是否是浮点类型(整形也是通过该函数判断)
bool isDouble() const;
// 是否是空值类型
bool isNull() const;
// 是否是字符串类型
bool isString() const;
// 是否是未定义类型(无法识别的类型)
bool isUndefined() const;
// 转换为Json数组
QJsonArray toArray(const QJsonArray &defaultValue) const;
QJsonArray toArray() const;
// 转换为布尔类型
bool toBool(bool defaultValue = false) const;
// 转换为浮点类型
double toDouble(double defaultValue = 0) const;
// 转换为整形
int toInt(int defaultValue = 0) const;
// 转换为Json对象
QJsonObject toObject(const QJsonObject &defaultValue) const;
QJsonObject toObject() const;
// 转换为字符串类型
QString toString() const;
QString toString(const QString &defaultValue) const;
2.3 QJsonArray
QJsonArray 封装了 Json 中的数组,在里边可以存储多个元素,
QJsonArray中的所有类型的操作,都需要统一为 QJsonValue 类型。因为 QJsonValue 类型封装了各个数据类型。比如:
- 如果QString类型对象想要插入到QJsonArray中,就需要将QString类型对象转换为QJsonValue类型,才插入到QJsonArray中。
- 同样,从QJsonArray中获取的QString对象都是QJsonValue,通过isString判断其对象,在使用toString转换成QString对象。其他类型也是采取这种方法。
常用接口
QJsonArray::QJsonArray();
//添加元素
void QJsonArray::append(const QJsonValue &value); // 在尾部追加
void QJsonArray::insert(int i, const QJsonValue &value); // 插入到 i 的位置之前
iterator QJsonArray::insert(iterator before, const QJsonValue &value);
void QJsonArray::prepend(const QJsonValue &value); // 添加到数组头部
void QJsonArray::push_back(const QJsonValue &value); // 添加到尾部
void QJsonArray::push_front(const QJsonValue &value); // 添加到头部
//删除元素
iterator QJsonArray::erase(iterator it); // 基于迭代器删除
void QJsonArray::pop_back(); // 删除尾部
void QJsonArray::pop_front(); // 删除头部
void QJsonArray::removeAt(int i); // 删除i位置的元素
void QJsonArray::removeFirst(); // 删除头部
void QJsonArray::removeLast(); // 删除尾部
QJsonValue QJsonArray::takeAt(int i); // 删除i位置的原始, 并返回删除的元素的值
//获取数组中的个数
int QJsonArray::count() const;
int QJsonArray::size() const;
//获取最后一个元素
QJsonValue QJsonArray::at(int i) const;
QJsonValue QJsonArray::first() const; // 头部元素
QJsonValue QJsonArray::last() const; // 尾部元素
QJsonValueRef QJsonArray::operator[](int i);
2.4 QJsonDocument
在QT中,从文件中或从网络中读取的数据是 QJson的字符流,这种字符流则用QJsonDocument来表示。
一张图表示QJsonDocument与QJsonObject 对象/QJsonArray对象的关系:
- 文件或者网络中进行传输的数据都是 字符流,如果是Json格式的字符流,则称为Json格式的字符流.
- 所以我们将封装好的QJsonObject 对象或者QJsonArray对象的数据 在与 文件/网络 传输之前,都需要将转换QJsonDocument对象,QJsonDocument对象在转换为QJson字符流进行传输。
常用的接口:
//将QJsonObject对象转换为QJsonDocument
QJsonDocument::QJsonDocument(const QJsonObject &object);
//将QJsonArray对象转换为QJsonDocument
QJsonDocument::QJsonDocument(const QJsonArray &array);
//将文件对象中的数据进行序列化
// 二进制格式的json字符串
QByteArray QJsonDocument::toBinaryData() const;
// 文本格式
QByteArray QJsonDocument::toJson(JsonFormat format = Indented) const;
//从网络或者文件中读取到字符串
//将字符串转换为QJsonDocumment类型
[static] QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidation validation = Validate);
// 参数文件格式的json字符串
[static] QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error = Q_NULLPTR);
// 判断文档对象中存储的数据是不是Json数组
bool QJsonDocument::isArray() const;
// 判断文档对象中存储的数据是不是json对象
bool QJsonDocument::isObject() const
// 文档对象中的数据转换为json对象
QJsonObject QJsonDocument::object() const;
// 文档对象中的数据转换为json数组
QJsonArray QJsonDocument::array() const;
3.示例
3.1 写操作
将如下的Json字符串写入到文件中:
- 创建一个QJsonOBject对象,将各个键值对设置进QJsonOBject对象中
- 将QJsonOBject对象转换为QJsonDocument对象
- QJsonDocument对象在转换为QByteArry对象中。
- 通过文件操作写入到文件中
/*
{
"Name":"lisa",
"Age":20,
//Family中的value值是一个Json对象
"Family":{
"Father":"Gol·D·Roger",
"Mother":"Portgas·D·Rouge",
"Brother":["Sabo", "Monkey D. Luffy"]
},
"IsAlive":false,
"Comment":"yyds"
}
*/
void qjson_write()
{
QJsonObject value;
value.insert("Name","lisa");
value.insert("age",20);
/*
封装:
"Family":{
"Father":"Gol·D·Roger",
"Mother":"Portgas·D·Rouge",
"Brother":["Sabo", "Monkey D. Luffy"]
}
*/
QJsonObject family_value;
family_value.insert("Father","Gol·D·Roger");
family_value.insert("Mother","Portgas·D·Rouge");
QJsonArray bro_arry;
bro_arry.push_back(QJsonValue("Sabo"));
bro_arry.push_back(QJsonValue("Monkey D. Luffy"));
family_value.insert("Brother",bro_arry);
value.insert("Family",family_value);
value.insert("IsAlive",false);
value.insert("Comment","yyds");
QJsonDocument document(value);
QByteArray s=document.toJson();
QFile file("E:\\test1.json");
file.open(QFile::WriteOnly);
file.write(s);
file.close();
}
输出:
toBinaryData()函数转化的效果;
toJson()函数转换的效果:
3.2 读操作
- 将上面的文件给读取到QJsonDocument,并转换为QJsonObject.
- 将其中键值为 age,Name 和 Comment的进行打印。
void qjson_read()
{
//打开文件,并读取Json字符串
QFile file("E:\\test1.json");
file.open(QFile::ReadOnly);
QByteArray s=file.readAll();
file.close();
//将Json字符串转换为QJsonDocument对象
QJsonDocument document=QJsonDocument::fromJson(s);
QJsonObject object;
if(document.isObject()){
object=document.object();
}
//获取所有的key值
QStringList keys=object.keys();
// qDebug()<<object.size();
//遍历QJsonObject中所有的键值对
for(int i=0;i<object.size();i++)
{
QString key=keys.at(i);
QJsonValue value=object[key];
if(value.isDouble())
{
int v=value.toInt();
qDebug()<<key<<v;
}
else if(value.isString())
{
QString s=value.toString();
qDebug()<<key<<s;
}
}
}
输出: