当前位置:   article > 正文

【QT】——QJson类的使用

qjson

目录

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. [1,2,3,4,5]
  4. // 字符串
  5. ["lisi", "haha", "xxx", "nihao", "robin"]
  6. //数据不一致:
  7. ["lisi", 1, null, 1.1, "robin"]
  8. //Json数组嵌套使用,Json数组中可以有Json数组
  9. [
  10. ["lisi", 1, null, 1.1, "robin"],
  11. [1,2,3,4,5],
  12. ["lisi", "haha", "xxx", "nihao", "robin"],
  13. "lisa"
  14. ]

1.2.Json对象

  • Json 对象使用 {} 来描述,每个 Json 对象中可以存储若干个元素,每一个元素对应一个键值(key:value 结构) 。
  • 键值(key)必须是字符串,位于同一层级的键值不能重复(因为是通过键值取出对应的 value 值)
  • value 值的类型是可选的,可根据实际需求指定,可用类型包括:整形、 浮点、 字符串、 布尔类型、 json数组、 json对象、 空值-null

  1. {
  2. "Name":"lisa",
  3. "Age":20,
  4. //Family中的value值是一个Json对象
  5. "Family":{
  6. "Father":"Gol·D·Roger",
  7. "Mother":"Portgas·D·Rouge",
  8. "Brother":["Sabo", "Monkey D. Luffy"]
  9. },
  10. "IsAlive":false,
  11. "Comment":"yyds"
  12. }

错误案例:

  1. // test.json
  2. {
  3. "name":"lisa",
  4. "age":19
  5. }
  6. {
  7. "user":"lisi",
  8. "passwd":"123456"
  9. }

在一个 Json 文件中只能有一个 Json 数组或者 Json 对象的根节点,不允许同时存储多个并列的根节点

2.QJson

  1. QJsonDocument:它封装了一个完整的 JSON 文档,并且可以从 UTF-8 编码的基于文本的表示以及 Qt 自己的二进制格式读取和写入该文档
  2. QJsonArray:QJsonArray是QT中的JSON 数组的类型。可以通过从数组中插入和删除 QJsonValue 来操作该列表。
  3. QJsonObject :QJsonObject是是QT中的Json对象类型,其中键是唯一的字符串,值由 QJsonValue 表示。
  4. QJsonValue:该类封装了 JSON 支持数据类型,是key-value中的 value类型。

2.1 QJsonObject

QJsonObject 封装了 Json 中的对象,在里边可以存储多个键值对.

下面是常用的接口函数:

  1. //构造函数
  2. QJsonObject::QJsonObject(); // 构造空对象
  3. //将键值对插入到json对象中
  4. iterator QJsonObject::insert(const QString &key, const QJsonValue &value);
  5. //删除键值对,通过key值进行删除
  6. void QJsonObject::remove(const QString &key);
  7. QJsonValue QJsonObject::take(const QString &key); // 返回key对应的value值
  8. //插值键值对
  9. iterator QJsonObject::find(const QString &key); //返回其迭代器
  10. bool QJsonObject::contains(const QString &key) const;//判断是否存在
  11. //获取键值对的 对数
  12. int QJsonObject::count() const;
  13. int QJsonObject::size() const;
  14. int QJsonObject::length() const;
  15. //通过key值获取value
  16. QJsonValue QJsonObject::value(const QString &key) const; // utf8
  17. QJsonValue QJsonObject::value(QLatin1String key) const; // 字符串不支持中文
  18. QJsonValue QJsonObject::operator[](const QString &key) const;
  19. QJsonValue QJsonObject::operator[](QLatin1String key) const;
  20. //查找
  21. iterator QJsonObject::find(const QString &key);
  22. bool QJsonObject::contains(const QString &key) const;

遍历方式 

  1. //获取Json对象中所有的 key值,返回到QStringList中。
  2. QStringList QJsonObject::keys() const;
  3. QStringList通过函数at取下标获取到各个QJsonObject每个对象的key值。
  4. 示例:
  5. //假设object对象中有很多个键值对,然后我们需要将每个键值对给取出来
  6. QJsonObject object;
  7. QStringList stringlist=object.keys();
  8. for(int i=0;i<object.size();i++)
  9. {
  10. //第i个键值对
  11. QString key=stringlist.at(i);
  12. QJsonValue value=object[key];
  13. }

2.2 QJsonValue

在 Qt 中 QJsonValue 可以封装的基础数据类型有六种(和 Json 支持的类型一致),分别为:

  • 布尔类型:QJsonValue::Bool
  • 浮点类型(包括整形): QJsonValue::Double
  • 字符串类型: QJsonValue::String
  • Json 数组类型: QJsonValue::Array
  • Json 对象类型:QJsonValue::Object
  • 空值类型: QJsonValue::Null

这些类型可以通过 QJsonValue 的构造函数被封装为一个类对象:

  1. 构造函数:
  2. // Json对象
  3. QJsonValue(const QJsonObject &o);
  4. // Json数组
  5. QJsonValue(const QJsonArray &a);
  6. // 字符串
  7. QJsonValue(const char *s);
  8. QJsonValue(QLatin1String s);
  9. QJsonValue(const QString &s);
  10. // 整形 and 浮点型
  11. QJsonValue(qint64 v);
  12. QJsonValue(int v);
  13. QJsonValue(double v);
  14. // 布尔类型
  15. QJsonValue(bool b);
  16. // 空值类型
  17. QJsonValue(QJsonValue::Type type = Null);
  18. //判断类型
  19. // 是否是Json数组
  20. bool isArray() const;
  21. // 是否是Json对象
  22. bool isObject() const;
  23. // 是否是布尔类型
  24. bool isBool() const;
  25. // 是否是浮点类型(整形也是通过该函数判断)
  26. bool isDouble() const;
  27. // 是否是空值类型
  28. bool isNull() const;
  29. // 是否是字符串类型
  30. bool isString() const;
  31. // 是否是未定义类型(无法识别的类型)
  32. bool isUndefined() const;
  33. // 转换为Json数组
  34. QJsonArray toArray(const QJsonArray &defaultValue) const;
  35. QJsonArray toArray() const;
  36. // 转换为布尔类型
  37. bool toBool(bool defaultValue = false) const;
  38. // 转换为浮点类型
  39. double toDouble(double defaultValue = 0) const;
  40. // 转换为整形
  41. int toInt(int defaultValue = 0) const;
  42. // 转换为Json对象
  43. QJsonObject toObject(const QJsonObject &defaultValue) const;
  44. QJsonObject toObject() const;
  45. // 转换为字符串类型
  46. QString toString() const;
  47. 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对象。其他类型也是采取这种方法。

常用接口

  1. QJsonArray::QJsonArray();
  2. //添加元素
  3. void QJsonArray::append(const QJsonValue &value); // 在尾部追加
  4. void QJsonArray::insert(int i, const QJsonValue &value); // 插入到 i 的位置之前
  5. iterator QJsonArray::insert(iterator before, const QJsonValue &value);
  6. void QJsonArray::prepend(const QJsonValue &value); // 添加到数组头部
  7. void QJsonArray::push_back(const QJsonValue &value); // 添加到尾部
  8. void QJsonArray::push_front(const QJsonValue &value); // 添加到头部
  9. //删除元素
  10. iterator QJsonArray::erase(iterator it); // 基于迭代器删除
  11. void QJsonArray::pop_back(); // 删除尾部
  12. void QJsonArray::pop_front(); // 删除头部
  13. void QJsonArray::removeAt(int i); // 删除i位置的元素
  14. void QJsonArray::removeFirst(); // 删除头部
  15. void QJsonArray::removeLast(); // 删除尾部
  16. QJsonValue QJsonArray::takeAt(int i); // 删除i位置的原始, 并返回删除的元素的值
  17. //获取数组中的个数
  18. int QJsonArray::count() const;
  19. int QJsonArray::size() const;
  20. //获取最后一个元素
  21. QJsonValue QJsonArray::at(int i) const;
  22. QJsonValue QJsonArray::first() const; // 头部元素
  23. QJsonValue QJsonArray::last() const; // 尾部元素
  24. QJsonValueRef QJsonArray::operator[](int i);

2.4 QJsonDocument

在QT中,从文件中或从网络中读取的数据是 QJson的字符流,这种字符流则用QJsonDocument来表示。

一张图表示QJsonDocument与QJsonObject 对象/QJsonArray对象的关系:

  •  文件或者网络中进行传输的数据都是 字符流,如果是Json格式的字符流,则称为Json格式的字符流.
  • 所以我们将封装好的QJsonObject 对象或者QJsonArray对象的数据 在与 文件/网络 传输之前,都需要将转换QJsonDocument对象,QJsonDocument对象在转换为QJson字符流进行传输。

常用的接口:

  1. //将QJsonObject对象转换为QJsonDocument
  2. QJsonDocument::QJsonDocument(const QJsonObject &object);
  3. //将QJsonArray对象转换为QJsonDocument
  4. QJsonDocument::QJsonDocument(const QJsonArray &array);
  5. //将文件对象中的数据进行序列化
  6. // 二进制格式的json字符串
  7. QByteArray QJsonDocument::toBinaryData() const;
  8. // 文本格式
  9. QByteArray QJsonDocument::toJson(JsonFormat format = Indented) const;
  10. //从网络或者文件中读取到字符串
  11. //将字符串转换为QJsonDocumment类型
  12. [static] QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidation validation = Validate);
  13. // 参数文件格式的json字符串
  14. [static] QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error = Q_NULLPTR);
  15. // 判断文档对象中存储的数据是不是Json数组
  16. bool QJsonDocument::isArray() const;
  17. // 判断文档对象中存储的数据是不是json对象
  18. bool QJsonDocument::isObject() const
  19. // 文档对象中的数据转换为json对象
  20. QJsonObject QJsonDocument::object() const;
  21. // 文档对象中的数据转换为json数组
  22. QJsonArray QJsonDocument::array() const;

3.示例

3.1 写操作

将如下的Json字符串写入到文件中:

  1. 创建一个QJsonOBject对象,将各个键值对设置进QJsonOBject对象中
  2. 将QJsonOBject对象转换为QJsonDocument对象
  3. QJsonDocument对象在转换为QByteArry对象中。
  4. 通过文件操作写入到文件中
  1. /*
  2. {
  3. "Name":"lisa",
  4. "Age":20,
  5. //Family中的value值是一个Json对象
  6. "Family":{
  7. "Father":"Gol·D·Roger",
  8. "Mother":"Portgas·D·Rouge",
  9. "Brother":["Sabo", "Monkey D. Luffy"]
  10. },
  11. "IsAlive":false,
  12. "Comment":"yyds"
  13. }
  14. */
  15. void qjson_write()
  16. {
  17. QJsonObject value;
  18. value.insert("Name","lisa");
  19. value.insert("age",20);
  20. /*
  21. 封装:
  22. "Family":{
  23. "Father":"Gol·D·Roger",
  24. "Mother":"Portgas·D·Rouge",
  25. "Brother":["Sabo", "Monkey D. Luffy"]
  26. }
  27. */
  28. QJsonObject family_value;
  29. family_value.insert("Father","Gol·D·Roger");
  30. family_value.insert("Mother","Portgas·D·Rouge");
  31. QJsonArray bro_arry;
  32. bro_arry.push_back(QJsonValue("Sabo"));
  33. bro_arry.push_back(QJsonValue("Monkey D. Luffy"));
  34. family_value.insert("Brother",bro_arry);
  35. value.insert("Family",family_value);
  36. value.insert("IsAlive",false);
  37. value.insert("Comment","yyds");
  38. QJsonDocument document(value);
  39. QByteArray s=document.toJson();
  40. QFile file("E:\\test1.json");
  41. file.open(QFile::WriteOnly);
  42. file.write(s);
  43. file.close();
  44. }

输出:

toBinaryData()函数转化的效果;

 toJson()函数转换的效果:

3.2 读操作

  • 将上面的文件给读取到QJsonDocument,并转换为QJsonObject.
  • 将其中键值为 age,Name 和 Comment的进行打印。
  1. void qjson_read()
  2. {
  3. //打开文件,并读取Json字符串
  4. QFile file("E:\\test1.json");
  5. file.open(QFile::ReadOnly);
  6. QByteArray s=file.readAll();
  7. file.close();
  8. //将Json字符串转换为QJsonDocument对象
  9. QJsonDocument document=QJsonDocument::fromJson(s);
  10. QJsonObject object;
  11. if(document.isObject()){
  12. object=document.object();
  13. }
  14. //获取所有的key值
  15. QStringList keys=object.keys();
  16. // qDebug()<<object.size();
  17. //遍历QJsonObject中所有的键值对
  18. for(int i=0;i<object.size();i++)
  19. {
  20. QString key=keys.at(i);
  21. QJsonValue value=object[key];
  22. if(value.isDouble())
  23. {
  24. int v=value.toInt();
  25. qDebug()<<key<<v;
  26. }
  27. else if(value.isString())
  28. {
  29. QString s=value.toString();
  30. qDebug()<<key<<s;
  31. }
  32. }
  33. }

输出: 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/1016479
推荐阅读
相关标签
  

闽ICP备14008679号