赞
踩
目录
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<object.size();i++)
- {
- //第i个键值对
- QString key=stringlist.at(i);
- QJsonValue value=object[key];
- }
在 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()<<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;
- }
- }
-
- }
输出:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。