目录
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 读操作
Json的基本概念
Json 是一种数据格式,和语言无关,在什么语言中都可以使用 Json,Json一般处理两种任务:
Json中主要两种数据格式:Json数组,和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"
]
{
"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 对象的根节点,不允许同时存储多个并列的根节点
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
在 Qt 中 QJsonValue 可以封装的基础数据类型有六种(和 Json 支持的类型一致),分别为:
这些类型可以通过 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;
QJsonArray 封装了 Json 中的数组,在里边可以存储多个元素,
QJsonArray中的所有类型的操作,都需要统一为 QJsonValue 类型。因为 QJsonValue 类型封装了各个数据类型。比如:
常用接口
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);
在QT中,从文件中或从网络中读取的数据是 QJson的字符流,这种字符流则用QJsonDocument来表示。
一张图表示QJsonDocument与QJsonObject 对象/QJsonArray对象的关系:
常用的接口:
//将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;
将如下的Json字符串写入到文件中:
/*
{
"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()函数转换的效果:
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()<
输出: