QJsonDocument实现Qt下JSON文档读写
博客地址已更改,文章数量较多不便批量修改,若想访问源文请到 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:
{
|
QJsonDocument::Compact |
1 |
Defines a compact output as follows:
{"Array":[true,999,"string"],"Key":"Value","null":null}
|
除此以外还可以用toBinaryData、toVariant用于结果输出
QJsonDocument除了使用构造函数创建以外,还支持静态函数创建,主要用于读取已有文件的内容:
- QJsonDocument fromBinaryData(const QByteArray &data, DataValidation validation = Validate)
- QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error = Q_NULLPTR)
- QJsonDocument fromRawData(const char *data, int size, DataValidation validation = Validate)
- 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范例
- {
- "Array": [
- true,
- 999,
- "string"
- ],
- "Key": "Value",
- "null": null
- }
3. 创建
- #include <QCoreApplication>
- #include <QJsonDocument>//json文档
- #include <QJsonArray>//json数组
- #include <QJsonObject>//json对象
- #include <QJsonValue>//json值
- #include <QJsonParseError>//错误处理
- #include <QDebug>
- int main(int argc, char *argv[]) {
- QCoreApplication a(argc, argv);
- QJsonDocument json;
- QJsonArray array;
- array.append(true);
- array.append(999);
- array.append("string");
- QJsonObject object;
- object.insert("Array",array);
- object.insert("Key","Value");
- //null用空的QJsonValue即可
- object.insert("null",QJsonValue());
- //最外层是大括号所以是object
- json.setObject(object);
- qDebug()<<json.toJson(QJsonDocument::Compact);
- return 0;
- }
此时使用QJsonDocument::Compact方式写出,其结果为:
“{\”Array\”:[true,999,\”string\”],\”Key\”:\”Value\”,\”null\”:null}”
QDebug会将\n直接输出成\n而不会换行
4. 解析
- #include <QCoreApplication>
- #include <QJsonDocument>//json文档
- #include <QJsonArray>//json数组
- #include <QJsonObject>//json对象
- #include <QJsonValue>//json值
- #include <QJsonParseError>//错误处理
- #include <QDebug>
- int main(int argc, char *argv[]) {
- QCoreApplication a(argc, argv);
- QJsonDocument json;
- QJsonArray array;
- array.append(true);
- array.append(999);
- array.append("string");
- QJsonObject object;
- object.insert("Array",array);
- object.insert("Key","Value");
- //null用空的QJsonValue即可
- object.insert("null",QJsonValue());
- //最外层是大括号所以是object
- json.setObject(object);
- auto json_text = json.toJson(QJsonDocument::Compact);
- auto json_binary = json.toBinaryData();
- QJsonDocument read1 = QJsonDocument::
- fromJson(json_text);
- QJsonDocument read2 = QJsonDocument::
- fromBinaryData(json_binary);
- //验证两个是一样的
- if(QString(read1.toBinaryData()) ==
- QString(read2.toBinaryData()))
- qDebug()<<"same";
- //用于判断是否为空,对QJsonXXX对象均支持
- if(!read1.isEmpty())
- qDebug()<<"empty";
- //下面开始解析代码
- if(read1.isObject() ) {
- auto read_object = read1.object();
- if(!read_object.isEmpty()) {
- qDebug()<<read_object.value("Key").toString();
- qDebug()<<read_object.value("null").isNull();
- QJsonValue value = read_object.value("Array");
- qDebug()<<value.type()<<value;
- if(value.isArray()) {
- auto read_array = value.toArray();
- for(auto one_of_array : read_array)
- qDebug()<<one_of_array;
- //此处建议判断好具体类型,因为array里面也可能有object
- }
- }
- }
- return 0;
- }
结果
- same
- empty
- "Value"
- true
- 4 QJsonValue(array, QJsonArray([true,999,"string"]))
- QJsonValue(bool, true)
- QJsonValue(double, 999)
- QJsonValue(string, "string")
根据正常的结构进行判断即可,对于array需要进行遍历,支持C++的for(:)方式遍历
fromJson、fromBinaryData、fromRawData、fromVariant这几个静态函数都不会直接返回成功与否,而是在参数中实现解析结果判断,正式使用时务必进行判断,避免后续代码均出错
5. 其他
- 对于每一步建议明确判断QJsonValut的type如果type错误,会输出为””,比如int类型用toString不会自动转换,而是直接写出””
- 相比于Qt使用core模块的xml读写,json操作很简单,不需要逐行的读取操作使用readNext,获取内容的顺序与文本顺序可以不一致,xml使用请见文章:QXmlStreamReader/QXmlStreamWriter实现Qt下xml文件读写
- 上面介绍的例子最外层为object,也支持最外层为array,使用setArray即可,最外层只能为一种,不能不断的add
- QJsonDocument主要负责的是数据文本格式或者说是表现方式的转换,其余类负责内容
- QJsonArray可以用size获取数组的大小,后续操作感觉类似于QList<QVariant> ,也具有迭代器
- QJsonParseError使用方式自行查看,主要是在解析时出现,但均不会作为返回值直接返回,在QJsonDocument::fromJson处使用,其余几个静态fromXXX函数直接返回枚举类型,此类操作均不可保证绝对正确,故应当做判断避免后续连锁错误。
QJsonDocument实现Qt下JSON文档读写的更多相关文章
- Qt入门学习——Qt 5 帮助文档的使用
Qt入门学习——Qt 5 帮助文档的使用 学习图形界面开发,肯定离不开帮助文档的使用,因为它不像 C 语言那样就那么几个函数接口,图形接口的接口可以用海量来形容,常用的我们可能能记住,其它的真的没有必 ...
- package.json文档
之前在博客中写过一篇关于 " node.js的安装配置 " 的文章,里面有提到利用 gulp watch 来监听文档的变化.其中需要 package.json 文件才能实现效果,所 ...
- C#.Net 使用 JsonReader/JsonWriter 高性能解析/生成 Json 文档
Swifter.Json 是由本人编写的高性能且多功能的 Json 解析库.下图是 Swifter.Json 与 .Net 平台上的其他 Json 库性能对比: 在 Swifter.Json 近期更新 ...
- 一个SQLServer中JSON文档型数据的查询问题
近日在项目中遇到一个问题: 如何在报表中统计JSON格式存储的数据? 例如有个调查问卷记录表,记录每个问题的答案. 其结构示意如下(横表设计) Id user date Q1_Answer Q2_An ...
- Collection+JSON 文档
Collection+JSON 文档 对于这个设计,我们不再以可能的状态和转移为起点,相反,我们将从一个集合状态响应中可能元素的顶层布局开始.从这一点入手,其他细节可以随着设计向超媒体类型最底层属性的 ...
- 不规范的json文档 转化成 java 对象的处理
最近练习爬取数据,遇到了json文档中属性名称没有用双引号的情况,内容如下: 标准的json文档,属性名称都是带双引号的 最后写了个方法,替换属性名字 为 两头追加双引号的属性名字, 特别要注意,防止 ...
- 【原】中文Ubuntu主目录下的文档文件夹改回英文
想把中文Ubuntu主目录下的文档文件夹改回英文,在Terminal下面操作的时候要输入中文特别不方便,于是便用了更改名字的想法 方法一: 首先把那几个中文名称修改成相应的英文,比如 Desktop. ...
- [Xcode 实际操作]七、文件与数据-(17)解析JSON文档
目录:[Swift]Xcode实际操作 本文将演示如何解析JSON文档. 项目中已添加一份JSON文档:menu.json { "menu": { "id": ...
- 教你用java统计目录下所有文档的词频
本文是统计目录下所有文档的词频top10,非单个文档,包含中文和英文. 直接上代码: package com.huawei.wordcount; import java.io.BufferedRead ...
随机推荐
- Windows系统Python 虚拟环境virtualenv安装
1.我们用pip安装virtualenv >pip3 install virtualenv 2.创建工程目录 >mkdir myproject 3.进入工程目录 >cd myproj ...
- 领扣-两数之和-Python实现
领扣每日一题 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个 ...
- Hive HQL基本操作
一. DDL操作 (数据定义语言) 具体参见:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL 其实就是我们在创建 ...
- PTA(BasicLevel)-1010 一元多项式求导
一.题目和题意分析 设计函数求一元多项式的导数.x^n [n为整数] 的一阶导数为nx^(n−1). 输入格式: 以指数递降方式输入多项式非零项系数和指数(*绝对值均为不超过 1000 的整数*).数 ...
- 20145234黄斐《java程序设计》第三周
教材学习内容总结 类与对象 定义:对象,与过程相对. Java中变量有2种类型,一个是基本类型,另一个则是类类型.基本类型在之前学过,本次学习类类型.使用Java撰写程序几乎都是在使用对象,要产生对象 ...
- 3.MUI端APP获取Json数据,并且实现遍历
在MUI中,对JSON的操作还是非常方便的. <script type="text/javascript"> var responseEl = document.get ...
- maven 发布springboot项目
1.把Spring Boot打包成JAR的形式,需要在pom.xml文件对应以下代码 <build> <finalName>ljl</finalName> //打包 ...
- 海思NB-IOT的SDK函数使用说明
1. 查询当前AT指令是否正在处理中 while(get_at_cmd_in_progress() == false); 2. 信号量发送函数 (, osNoWait); 3. 信号量接收函数 if( ...
- Spring学习(十一)-----Spring使用@Required注解依赖检查
Spring学习(九)-----Spring依赖检查 bean 配置文件用于确定的特定类型(基本,集合或对象)的所有属性被设置.在大多数情况下,你只需要确保特定属性已经设置但不是所有属性.. 对于这种 ...
- 如何在makfile中查看变量的值
在makefile中查看变量的取值是多少应该是一个比较麻烦的问题,但是本大神自己研究出一个十分方便的方法.这个方法十分简单.现在介绍如下 如果在一个十分复杂庞大的makefile文件中,有个地方用到一 ...