博客地址已更改,文章数量较多不便批量修改,若想访问源文请到 coologic博客 查阅,网址:www.coologic.cn

如本文记录地址为 techieliang.com/A/B/C/ 请改为 www.coologic.cn/A/B/C/ 即可查阅

版权声明:若无来源注明,Techie亮博客文章均为原创。 转载请以链接形式标明本文标题和地址:
本文标题:QJsonDocument实现Qt下JSON文档读写     本文地址:http://techieliang.com/2017/12/718/

1. 介绍

Qt提供了一系列类以供进行Json 文档的读写,分别为:

QJsonDocumentJson文档、QJsonArray数组、QJsonObject对象、QJsonValue值、QJsonParseError错误。

1.1. 错误分类

Constant Value Description
QJsonParseError::NoError 0 No error occurred
QJsonParseError::UnterminatedObject 1 An object is not correctly terminated with a closing curly bracket
QJsonParseError::MissingNameSeparator 2 A comma separating different items is missing
QJsonParseError::UnterminatedArray 3 The array is not correctly terminated with a closing square bracket
QJsonParseError::MissingValueSeparator 4 A colon separating keys from values inside objects is missing
QJsonParseError::IllegalValue 5 The value is illegal
QJsonParseError::TerminationByNumber 6 The input stream ended while parsing a number
QJsonParseError::IllegalNumber 7 The number is not well formed
QJsonParseError::IllegalEscapeSequence 8 An illegal escape sequence occurred in the input
QJsonParseError::IllegalUTF8String 9 An illegal UTF8 sequence occurred in the input
QJsonParseError::UnterminatedString 10 A string wasn’t terminated with a quote
QJsonParseError::MissingObject 11 An object was expected but couldn’t be found
QJsonParseError::DeepNesting 12 The JSON document is too deeply nested for the parser to parse it
QJsonParseError::DocumentTooLarge 13 The JSON document is too large for the parser to parse it
QJsonParseError::GarbageAtEnd 14 The parsed document contains additional garbage characters at the end

1.2. Json内容读写

QJsonDocument::toJson可以生成json文档,具有可选参数,可以生成紧凑结构和缩进结构:

Constant Value Description
QJsonDocument::Indented 0 Defines human readable output as follows:

{
"Array": [
true,
999,
"string"
],
"Key": "Value",
"null": null
}
QJsonDocument::Compact 1 Defines a compact output as follows:

{"Array":[true,999,"string"],"Key":"Value","null":null}

除此以外还可以用toBinaryDatatoVariant用于结果输出

QJsonDocument除了使用构造函数创建以外,还支持静态函数创建,主要用于读取已有文件的内容:

  1. QJsonDocument fromBinaryData(const QByteArray &data, DataValidation validation = Validate)
  2. QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error = Q_NULLPTR)
  3. QJsonDocument fromRawData(const char *data, int size, DataValidation validation = Validate)
  4. QJsonDocument fromVariant(const QVariant &variant)

QJsonDocument并不会直接操作文件,需要自行利用QFile进行readAll或者Write

fromRawData/fromBinaryData并不会返回QJsonParseError错误而是直接返回DataValidation枚举类型,表明读取的数据是否有效

Constant Value Description
QJsonDocument::Validate 0 Validate the data before using it. This is the default.
QJsonDocument::BypassValidation 1 Bypasses data validation. Only use if you received the data from a trusted place and know it’s valid, as using of invalid data can crash the application.

1.3. 数据类型

QJsonValue用于存储所有值,可以用type判断其类型,含以下类型

Constant Value Description
QJsonValue::Null 0x0 A Null value
QJsonValue::Bool 0x1 A boolean value. Use toBool() to convert to a bool.
QJsonValue::Double 0x2 A double. Use toDouble() to convert to a double.
QJsonValue::String 0x3 A string. Use toString() to convert to a QString.
QJsonValue::Array 0x4 An array. Use toArray() to convert to a QJsonArray.
QJsonValue::Object 0x5 An object. Use toObject() to convert to a QJsonObject.
QJsonValue::Undefined 0x80 The value is undefined. This is usually returned as an error condition, when trying to read an out of bounds value in an array or a non existent key in an object.

也可以通过isXXXX用于判断,并通过toXXXX转换为对应类型

2. 读写操作

2.1. json范例

  1. {
  2. "Array": [
  3. true,
  4. 999,
  5. "string"
  6. ],
  7. "Key": "Value",
  8. "null": null
  9. }

3. 创建

  1. #include <QCoreApplication>
  2. #include <QJsonDocument>//json文档
  3. #include <QJsonArray>//json数组
  4. #include <QJsonObject>//json对象
  5. #include <QJsonValue>//json值
  6. #include <QJsonParseError>//错误处理
  7. #include <QDebug>
  8. int main(int argc, char *argv[]) {
  9. QCoreApplication a(argc, argv);
  10. QJsonDocument json;
  11. QJsonArray array;
  12. array.append(true);
  13. array.append(999);
  14. array.append("string");
  15. QJsonObject object;
  16. object.insert("Array",array);
  17. object.insert("Key","Value");
  18. //null用空的QJsonValue即可
  19. object.insert("null",QJsonValue());
  20. //最外层是大括号所以是object
  21. json.setObject(object);
  22. qDebug()<<json.toJson(QJsonDocument::Compact);
  23. return 0;
  24. }

此时使用QJsonDocument::Compact方式写出,其结果为:

“{\”Array\”:[true,999,\”string\”],\”Key\”:\”Value\”,\”null\”:null}”

QDebug会将\n直接输出成\n而不会换行

4. 解析

  1. #include <QCoreApplication>
  2. #include <QJsonDocument>//json文档
  3. #include <QJsonArray>//json数组
  4. #include <QJsonObject>//json对象
  5. #include <QJsonValue>//json值
  6. #include <QJsonParseError>//错误处理
  7. #include <QDebug>
  8. int main(int argc, char *argv[]) {
  9. QCoreApplication a(argc, argv);
  10. QJsonDocument json;
  11. QJsonArray array;
  12. array.append(true);
  13. array.append(999);
  14. array.append("string");
  15. QJsonObject object;
  16. object.insert("Array",array);
  17. object.insert("Key","Value");
  18. //null用空的QJsonValue即可
  19. object.insert("null",QJsonValue());
  20. //最外层是大括号所以是object
  21. json.setObject(object);
  22. auto json_text = json.toJson(QJsonDocument::Compact);
  23. auto json_binary = json.toBinaryData();
  24. QJsonDocument read1 = QJsonDocument::
  25. fromJson(json_text);
  26. QJsonDocument read2 = QJsonDocument::
  27. fromBinaryData(json_binary);
  28. //验证两个是一样的
  29. if(QString(read1.toBinaryData()) ==
  30. QString(read2.toBinaryData()))
  31. qDebug()<<"same";
  32. //用于判断是否为空,对QJsonXXX对象均支持
  33. if(!read1.isEmpty())
  34. qDebug()<<"empty";
  35. //下面开始解析代码
  36. if(read1.isObject() ) {
  37. auto read_object = read1.object();
  38. if(!read_object.isEmpty()) {
  39. qDebug()<<read_object.value("Key").toString();
  40. qDebug()<<read_object.value("null").isNull();
  41. QJsonValue value = read_object.value("Array");
  42. qDebug()<<value.type()<<value;
  43. if(value.isArray()) {
  44. auto read_array = value.toArray();
  45. for(auto one_of_array : read_array)
  46. qDebug()<<one_of_array;
  47. //此处建议判断好具体类型,因为array里面也可能有object
  48. }
  49. }
  50. }
  51. return 0;
  52. }

结果

  1. same
  2. empty
  3. "Value"
  4. true
  5. 4 QJsonValue(array, QJsonArray([true,999,"string"]))
  6. QJsonValue(bool, true)
  7. QJsonValue(double, 999)
  8. QJsonValue(string, "string")

根据正常的结构进行判断即可,对于array需要进行遍历,支持C++的for(:)方式遍历

fromJson、fromBinaryData、fromRawData、fromVariant这几个静态函数都不会直接返回成功与否,而是在参数中实现解析结果判断,正式使用时务必进行判断,避免后续代码均出错

5. 其他

  1. 对于每一步建议明确判断QJsonValut的type如果type错误,会输出为””,比如int类型用toString不会自动转换,而是直接写出””
  2. 相比于Qt使用core模块的xml读写,json操作很简单,不需要逐行的读取操作使用readNext,获取内容的顺序与文本顺序可以不一致,xml使用请见文章:QXmlStreamReader/QXmlStreamWriter实现Qt下xml文件读写
  3. 上面介绍的例子最外层为object,也支持最外层为array,使用setArray即可,最外层只能为一种,不能不断的add
  4. QJsonDocument主要负责的是数据文本格式或者说是表现方式的转换,其余类负责内容
  5. QJsonArray可以用size获取数组的大小,后续操作感觉类似于QList<QVariant> ,也具有迭代器
  6. QJsonParseError使用方式自行查看,主要是在解析时出现,但均不会作为返回值直接返回,在QJsonDocument::fromJson处使用,其余几个静态fromXXX函数直接返回枚举类型,此类操作均不可保证绝对正确,故应当做判断避免后续连锁错误。
转载请以链接形式标明本文标题和地址:Techie亮博客 » QJsonDocument实现Qt下JSON文档读写

QJsonDocument实现Qt下JSON文档读写的更多相关文章

  1. Qt入门学习——Qt 5 帮助文档的使用

    Qt入门学习——Qt 5 帮助文档的使用 学习图形界面开发,肯定离不开帮助文档的使用,因为它不像 C 语言那样就那么几个函数接口,图形接口的接口可以用海量来形容,常用的我们可能能记住,其它的真的没有必 ...

  2. package.json文档

    之前在博客中写过一篇关于 " node.js的安装配置 " 的文章,里面有提到利用 gulp watch 来监听文档的变化.其中需要 package.json 文件才能实现效果,所 ...

  3. C#.Net 使用 JsonReader/JsonWriter 高性能解析/生成 Json 文档

    Swifter.Json 是由本人编写的高性能且多功能的 Json 解析库.下图是 Swifter.Json 与 .Net 平台上的其他 Json 库性能对比: 在 Swifter.Json 近期更新 ...

  4. 一个SQLServer中JSON文档型数据的查询问题

    近日在项目中遇到一个问题: 如何在报表中统计JSON格式存储的数据? 例如有个调查问卷记录表,记录每个问题的答案. 其结构示意如下(横表设计) Id user date Q1_Answer Q2_An ...

  5. Collection+JSON 文档

    Collection+JSON 文档 对于这个设计,我们不再以可能的状态和转移为起点,相反,我们将从一个集合状态响应中可能元素的顶层布局开始.从这一点入手,其他细节可以随着设计向超媒体类型最底层属性的 ...

  6. 不规范的json文档 转化成 java 对象的处理

    最近练习爬取数据,遇到了json文档中属性名称没有用双引号的情况,内容如下: 标准的json文档,属性名称都是带双引号的 最后写了个方法,替换属性名字 为 两头追加双引号的属性名字, 特别要注意,防止 ...

  7. 【原】中文Ubuntu主目录下的文档文件夹改回英文

    想把中文Ubuntu主目录下的文档文件夹改回英文,在Terminal下面操作的时候要输入中文特别不方便,于是便用了更改名字的想法 方法一: 首先把那几个中文名称修改成相应的英文,比如 Desktop. ...

  8. [Xcode 实际操作]七、文件与数据-(17)解析JSON文档

    目录:[Swift]Xcode实际操作 本文将演示如何解析JSON文档. 项目中已添加一份JSON文档:menu.json { "menu": { "id": ...

  9. 教你用java统计目录下所有文档的词频

    本文是统计目录下所有文档的词频top10,非单个文档,包含中文和英文. 直接上代码: package com.huawei.wordcount; import java.io.BufferedRead ...

随机推荐

  1. Python学习 :常用模块(三)----- 日志记录

    常用模块(三) 七.logging模块 日志中包含的信息应有正常的程序访问日志,还可能有错误.警告等信息输出 python的 logging 模块提供了标准的日志接口,你可以通过它存储各种格式的日志, ...

  2. PHP 审计

    1.get  和post  上传数组,数组的sha1值相等 通过阅读代码,我们发现要想得到flag就要达到下面三个条件: 使 uname的sha1值 与 passwd的sha1的值 相等    但是同 ...

  3. 读书笔记《PHP高级程序设计、模式、框架与测试》

    序言 闲来无事,下载了一些电子书,然后看书名不错<PHP高级程序设计_模式.框架与测试>,翻了一下虽然书有点老了但是讲的内容经常会碰到!给大家推荐一下,然后这里放上我的读书笔记,每日更新. ...

  4. 在客户端模拟调用srv和topic

    rostopic pub -r 10 /toipic_name Tab+Tab rosservice call /service_name  Tab+Tab rostopic pub -r 10 /c ...

  5. python中Excel表操作

    python中关于excel表个的操作 使用 python中的xlwt和xlrd模块进行操作 # 2003之前:Excel:xls# 2003之后:Excel:xlsx# xlrd:读取的模块:xls ...

  6. 20155302 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    20155302 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Jav ...

  7. 20155317 2016-2017-2 《Java程序设计》实验一 Java开发环境的熟悉

    20155317 2016-2017-2 <Java程序设计>实验一 Java开发环境的熟悉 实验内容 使用JDK编译.运行简单的Java程序: 使用IDEA 编辑.编译.运行.调试Jav ...

  8. 2017-2018-1 20155321《信息安全技术》实验二——Windows口令破解

    2017-2018-1 20155321<信息安全技术>实验二--Windows口令破解 实验原理 口令破解方法 口令破解主要有两种方法:字典破解和暴力破解. 字典破解是指通过破解者对管理 ...

  9. C#基础之接口

    对于接口一直以来都清楚自己理解的不深入,这两天重温以前的代码时更加发现对接口的理解仅仅限于定义而已,得好好学学接口了. 1.接口的特点 接口的定义是指定一组函数成员而不实现成员的引用类型,其它类型和接 ...

  10. pgpool-II的master-slave模式的分析

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL集群方案相关索引页     回到顶级页面:PostgreSQL索引页 现象描述: 客户来邮件,问:为何Pgpool-II ...