Qt中JSON操作的具体使用

目录
  • QJsonValue
  • QJsonObject
  • QJsonArray
  • QJsonDocument

JSON(JavaScript Object Notation,js对象标记)是一种轻量级的数据交换格式。它基于ECMAScript的一个子集,使用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的的层次结构使得JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效的提升网络传输效率。关于JSON的更多解释,请参看JSON官网

在Qt库中,为JSON的相关操作提供了完整的类支持,包括QJsonValue,QJsonObject,QJsonArray,QJsonDocument和QJsonParseError。其中,QJsonValue类表示json格式中的一个值;QJsonObject表示一个json对象;QJsonArray顾名思义表示一个json数组;QJsonDocument主要用来读写json文档;而QJsonParseError是用来表示json解析过程中出现的错误的方便类。下面,我们就来看看这些类的详细信息。

QJsonValue

QJsonValue类封装了一个json格式中的值。该值可以是如下6中基本类型:

  • bool QJsonValue::Bool
  • double QJsonValue::Double
  • string QJsonValue::String
  • array QJsonValue::Array
  • object QJsonValue::Object
  • null QJsonValue::Null

一个QJsonValue可以表示上面任何一种数据类型。此外,QJsonValue还有一个特殊的标志用来表示未定义的值。可以使用isUndefined()函数来进行判断。而一个QJsonValue中存储的类型可以通过type()或isBool(),isString()之类的函数进行查询。同样,QJsonValue中存储的值可以通过toBool(),toString()等函数转换到具体的类型。

QJsonValue中存储的值在内部是强类型的,并且和QVariant相反,它不会尝试进行任何的隐式类型转换。这意味着将QJsonValue转换成一个不是它存储的类型,将返回一个该类型的模型构造函数返回的值。

其实,说到QJsonValue,还有另一个类要说,QJsonValueRef,该类是一个对于QJsonArray和QJsonObject来说的一个帮助类。当你获得一个QJsonValueRef类的对象后,你可以把它当做一个QJsonValue对象的应用来使用。如果你向他赋值,该值会实际作用到底层的QJsonArray或者QJsonObject对象中的元素上。而要想使用该类,可以使用一下的两个方法:

  • QJsonArray::operator[](int i)
  • QJsonObject::operator[](const QString& key)const;

下面来看一下QJsonValue的构造函数:

QJsonValue(Type type = Null)
QJsonValue(bool b)
QJsonValue(double n)
QJsonValue(int n)
QJsonValue(qint64 n)
QJsonValue(const QString &s)
QJsonValue(QLatin1String s)
QJsonValue(const char *s)
QJsonValue(const QJsonArray &a)
QJsonValue(const QJsonObject &o)
QJsonValue(const QJsonValue &other)

可以看到,该类主要是对基本类型的一个包装。

QJsonObject

QJsonObject类封装了一个json对象。一个json对象是一个键值对的列表,其中key是唯一的字符串,而值就是一个我们上面讲到的QJsonValue。一个QJsonObject的对象可以转换到QVariantMap,要可以由QVariantMap转换得到。 我们可以使用size()函数来查询一个QJsonObject中存储的键值对的个数;使用insert()和remove()来插入或从中删除键值对;还可以使用标准的C++迭代器来遍历它。 QJsonObject类是一个隐式共享类。 其构造函数如下:

  QJsonObject object
  {
      {"property1", 1},
      {"property2", 2}
  };

我们可以使用初始化列表来快速的构建一个QJsonObject对象。如下:

  QJsonObject object
  {
      {"property1", 1},
      {"property2", 2}
  };

如此之外,比较常用的就是insert()函数了:

iterator QJsonObject::insert(const QString &key, const QJsonValue &value)

一般,我们可以先定义一个空的QJsonObject对象,然后使用该函数向其中插入需要的键值对。如果新插入的key已存在,那么会进行替换。

下面,我们通过一个例子还使用该类构造如下json字符串:{"name":"lily", "age":23, "addr":{"city":"xxx", "province":"yyy"}} 代码如下:

#include <QCoreApplication>
#include <QDebug>
#include <QJsonObject>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QJsonObject obj;
    obj.insert("name", "lily");
    obj.insert("age", 23);
    QJsonObject addr;
    addr.insert("city", "guangzhou");
    addr.insert("province", "guangdong");
    obj.insert("addr", addr);
    qDebug() << obj;

    return a.exec();
}

我们先构建了一个QJsonObject对象obj,然后向其中插入姓名和年龄键值对;因为地址又是一个QJsonObject,所以我们又构建了addr对象,向其中插入城市和省份,最后,将该QJsonObject做为地址键值对的值,插入到obj中。打印结果如下:

QJsonArray

顾名思义,QJsonArray封装了一个JSON数组。一个JSON数组是一个值的列表。我们可以向这个列表中插入或删除QJsonValue。

同时,我们可以把一个QVariantList转换成一个QJsonArray。也可以使用标准C++迭代器对它进行遍历。 其构造函数如下:

QJsonArray()
QJsonArray(std::initializer_list<QJsonValue> args)
QJsonArray(const QJsonArray &other)

我们也可以像上面那样,使用一个初始化列表来构建一个QJsonArray对象:

QJsonArray array = { 1, 2.2, QString() };

在此我们只使用了单个的值,没有使用键值对。其实,这样的json对象,一般我们就称为数组。

和QJsonObject一样,我们一般也是通过它的insert()函数来生成我们需要的json数组:

void insert(int i, const QJsonValue &value)
iterator insert(iterator before, const QJsonValue &value)

下面,我们继续上面的例子,来生成一个表示人物信息的列表。代码如下:

#include <QCoreApplication>
#include <QDebug>
#include <QJsonObject>
#include <QJsonArray>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QJsonObject obj1;
    obj1.insert("name", "lily");
    obj1.insert("age", 23);
    QJsonObject addr1;
    addr1.insert("city", "guangzhou");
    addr1.insert("province", "guangdong");
    obj1.insert("addr", addr1);
    qDebug() << obj1;

    QJsonObject obj2;
    obj2.insert("name", "tom");
    obj2.insert("age", 24);
    QJsonObject addr2;
    addr2.insert("city", "shenzhen");
    addr2.insert("province", "guangdong");
    obj2.insert("addr", addr2);
    qDebug() << obj2;

    QJsonObject obj3;
    obj3.insert("name", "jerry");
    obj3.insert("age", 24);
    QJsonObject addr3;
    addr3.insert("city", "foshan");
    addr3.insert("province", "guangdong");
    obj3.insert("addr", addr3);
    qDebug() << obj3;

    QJsonArray array;
    array.push_back(obj1);
    array.push_back(obj2);
    array.push_back(obj3);
    qDebug() << array;

    return a.exec();
}

在此,我们只是简单的构建了三个人物的QJsonObject对象,然后将它们放入一个QJsonArray中。输入结果如下:

QJsonDocument

QJsonDocument类提供了读写JSON文档的方法。QJsonDocument类包装了一个完整的JSON 文档,我们可以以utf-8编码的文本格式和Qt自己的二进制格式来操作该文档。一个JSON文档可以使用QJsonDocument::fromJson()函数转换json文本字符串来得到。而toJson()可以将其转换成文本。这个解析器是非常快速和高效的,Qt也是使用它来将JSON对象转换成其二进制表示的。解析得到的文档可以使用isNull()来判断是否有效。还可以使用isArray()和isObject()函数来判断该文档所包含的是否是数据或json对象。如果是,可以使用array()或object()函数还获得其中的对象或数组。

其构造函数如下:

QJsonDocument()
QJsonDocument(const QJsonObject &object)
QJsonDocument(const QJsonArray &array)
QJsonDocument(const QJsonDocument &other)

除了构造函数外,该类还提供了两个转换函数,可以将json文档序列化为二进制对象,然后我们就可以将该对象存储到文件中,或发送到网络上。

QByteArray toBinaryData() const
QByteArray toJson(JsonFormat format = Indented) const

下面,我们就使用该类将我们上面生成的json数组写入到文件中:

代码如下:

#include <QCoreApplication>
#include <QDebug>
#include <QJsonObject>
#include <QJsonArray>
#include <QFile>
#include <QJsonDocument>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QJsonObject obj1;
    obj1.insert("name", "lily");
    obj1.insert("age", 23);
    QJsonObject addr1;
    addr1.insert("city", "guangzhou");
    addr1.insert("province", "guangdong");
    obj1.insert("addr", addr1);
    qDebug() << obj1;

    QJsonObject obj2;
    obj2.insert("name", "tom");
    obj2.insert("age", 24);
    QJsonObject addr2;
    addr2.insert("city", "shenzhen");
    addr2.insert("province", "guangdong");
    obj2.insert("addr", addr2);
    qDebug() << obj2;

    QJsonObject obj3;
    obj3.insert("name", "jerry");
    obj3.insert("age", 24);
    QJsonObject addr3;
    addr3.insert("city", "foshan");
    addr3.insert("province", "guangdong");
    obj3.insert("addr", addr3);
    qDebug() << obj3;

    QJsonArray array;
    array.push_back(obj1);
    array.push_back(obj2);
    array.push_back(obj3);
    qDebug() << array;

    QJsonDocument jsonDoc(array);
    QByteArray ba = jsonDoc.toJson();
    QFile file("result.json");
    if(!file.open(QIODevice::WriteOnly))
    {
        qDebug() << "write json file failed";
        return 0;
    }
    file.write(ba);
    file.close();

    return a.exec();
}

我们先使用QJsonArray构建出一个QJsonDocument对象,然后调用其toJson()方法,将该json文档转换成一个字节数组。注意,toJson()函数会接受一个格式化参数:

QByteArray QJsonDocument::toJson(JsonFormat format = Indented) const

其中,format主要有两种格式,一种是人们可读的格式,一种是紧凑的格式。分别描述如下表:

Constant Value Description
QJsonDocument::Indented 0 定义人们可读的输出格式,如下:
{
"Array":[
true,
999,
"string"
],
"key": "value",
"null": null
}
QJsonDocument::Compact 1 定义一个紧凑的输出格式,如下:
{"Array": [true, 999, "string"], "key": "value", "null":null}

toJson()函数默认使用Indented,一缩进的形式生成人们可读的json文件。

运行该程序后,在编译目录查看生成的json文件。结果如下:

当然,除了将json对象写入到文件中,QJsonDocument还提供了几个静态函数,将从文件中读取出的原始数据或json字符串转换成一个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)

下面,我们就使用这些函数,将我们写入到文件中的json对象再读出来,并生成一个QJsonDocument对象。

代码如下:

#include <QCoreApplication>
#include <QDebug>
#include <QFile>
#include <QJsonDocument>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QFile file("result.json");
    if(!file.open(QIODevice::ReadOnly))
    {
        qDebug() << "read json file failed";
        return 0;
    }
    QByteArray ba = file.readAll();
    qDebug() << "读出的数据如下:";
    qDebug() << ba;
    QJsonParseError e;
    QJsonDocument jsonDoc = QJsonDocument::fromJson(ba, &e);
    if(e.error == QJsonParseError::NoError && !jsonDoc.isNull())
    {
        qDebug() << jsonDoc;
    }

    return a.exec();
}

在此,因为我们从文件中读出的是一个json形式的字符串,所以可以使用fromJson()函数,将其转换成一个QJsonDocument对象。同时,在调用fromJson()函数时,我们还为它传入了一个QJsonParseError对象,用来接收解析json字符串的过程中,有可能发生的错误信息。

代码运行如下:

到此这篇关于Qt中JSON操作的具体使用的文章就介绍到这了,更多相关Qt JSON操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ qt 使用jsoncpp json 读写操作

    JsonCpp的使用 项目需要c++下使用json,我选择了JsonCpp,官网是:https://github.com/open-source-parsers/jsoncpp. 解压后使用python编译出两个h文件和一个cpp文件: (电脑需要安装python自己百度安装,这里就不说了) 安装python后,打开windows下cmd窗口,进入到jsoncpp文件夹  如图: 执行命令:python amalgamate.py 就会生成dist文件夹 里面有 json.h json-forw

  • C/C++ QT实现解析JSON文件的示例代码

    JSON是一种轻量级的数据交换格式,它是基于ECMAScript的一个子集,使用完全独立于编程语言的文本格式来存储和表示数据,简洁清晰的的层次结构使得JSON成为理想的数据交换语言,Qt库为JSON的相关操作提供了完整的类支持. 创建一个解析文件,命名为config.json我们将通过代码依次解析这个JSON文件中的每一个参数,具体解析代码如下: { "blog": "https://www.cnblogs.com/lyshark", "enable&qu

  • C/C++ Qt 运用JSON解析库的实例代码

    JSON是一种简单的轻量级数据交换格式,Qt库为JSON的相关操作提供了完整的类支持,使用JSON解析文件之前需要先通过TextStream流将文件读入到字符串变量内,然后再通过QJsonDocument等库对该JSON格式进行解析,以提取出我们所需字段. 首先创建一个解析文件,命名为config.json我们将通过代码依次解析这个JSON文件中的每一个参数,具体解析代码如下: { "blog": "https://www.cnblogs.com/lyshark",

  • Qt中JSON操作的具体使用

    目录 QJsonValue QJsonObject QJsonArray QJsonDocument JSON(JavaScript Object Notation,js对象标记)是一种轻量级的数据交换格式.它基于ECMAScript的一个子集,使用完全独立于编程语言的文本格式来存储和表示数据.简洁和清晰的的层次结构使得JSON成为理想的数据交换语言.易于人阅读和编写,同时也易于机器解析和生成,并有效的提升网络传输效率.关于JSON的更多解释,请参看JSON官网. 在Qt库中,为JSON的相关操

  • golang中json操作的完全指南

    目录 前言 1. 结构体与JSON互转 2. map与JSON互转 3. 结构体的变量不加tag标签能否正常转成json数据 4. JSON操作的一些小技巧 (1)忽略掉 struct 指定字段 (2)添加额外的字段 (3)合并两个 struct (4)字符串传递给 int类型 (5)一个 json 分成两个struct 补充:GoLang json格式化输出 总结 前言 JSON是一种轻量级的数据交换格式.易于阅读和编写. golang 提供了 encoding/json 包来操作JSON数据

  • python中json操作之json.loads、json.load、json.jumps及json.jump用法

    目录 前言 0.python类型与json类型互换表 1.将json字符串转化(反序列化) (1)json.loads (2)json.load 延伸:如果.json文件中有注释怎么办 2.将python对象转化(序列化) (1)json.dumps (2)json.dump 总结 前言 经常在Python中对JSON格式的文件进行操作,今天对这些操作做一个总结 首先,需要导入json库import json 0.python类型与json类型互换表 Python JSON dict objec

  • Mysql5.7中JSON操作函数使用说明

    前言 JSON是一种轻量级的数据交换格式,采用了独立于语言的文本格式,类似XML,但是比XML简单,易读并且易编写.对机器来说易于解析和生成,并且会减少网络带宽的传输. JSON的格式非常简单: 名称/键值 .之前MySQL版本里面要实现这样的存储,要么用VARCHAR要么用TEXT大文本. MySQL5.7发布后,专门设计了JSON数据类型以及关于这种类型的检索以及其他函数解析. 下面一起来实际操作一下. 创建带有 JSON 字段的表 比如一个'文章'表,字段包括 id.标题 title.标签

  • js中json对象和字符串的理解及相互转化操作实现方法

    本文实例讲述了js中json对象和字符串的理解及相互转化操作实现方法.分享给大家供大家参考,具体如下: <script> var str="{'strv':["+ "{'a':'a11'},"+ " {'a':'b222'}"+ " ]}"; //如果放在一行更清楚:var str="{'strv':[{'a':'a11'}, {'a':'b222'} ]}"; var str2=eval('(

  • 详细解读Python中的json操作

    目录 1.什么是Json? 2.python数据类型与json数据类型的映射关系 3. json中常用的方法 3-1   json.dumps() 3-2 json.loads() 3-3 json.dump() 3-4 json.load() 4.参数详解: 总结 1.什么是Json? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它是JavaScript的子集,易于人阅读和编写. 前端和后端进行数据交互,其实就是JS和Python进行数据交互

  • javascript中JSON.parse()与eval()解析json的区别

    本文实例讲述了javascript中JSON.parse()与eval()解析json的区别.分享给大家供大家参考,具体如下: JSON(JavaScript Object Notation)是一种轻量级的数据格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是Javascript原生格式,这意味着在javascript中处理JSON数据 基本格式: varjsonData='{"data1":"Hello,","data2"

  • JavaScript常见JSON操作实例分析

    本文实例讲述了JavaScript常见JSON操作.分享给大家供大家参考,具体如下: 1.JSON JSON,JavaScript Object Notation)(JavaScript对象表示法) ,是存储和交换文本信息的语法,是基于JavaScript的一个子集.数据格式简单,易于读写,占用带宽小,类似 XML,但JSON 比 XML更小.更快,更易解析. JSON不支持变量.函数.对象实例,只是一种数据的格式.数据在键值对中,数据由逗号分隔. 2.JSON数据类型 (1)简单数据类型:字符

  • .Net中的json操作类用法分析

    本文实例展示了.Net中的json操作类用法,对于进行.Net程序设计来说是非常重要的技巧.具体分析如下: 首先需要引用 System.Web.Extensions.dll 这个类库 命名空间需要加上:System.Web.Script.Serialization   数据结构如下: public class Team { public string Name { get; set; } public List<User> Users { get; set; } } public class

  • 在vue-cli3中使用axios获取本地json操作

    在vue-cli3中,公共文件夹由static变成了public 先把要访问的json放到public文件夹下 使用axios的get方法获取,不能用post,不然会报404 axios.get(`./china-main-city/100000.json`) .then((data) => { console.log(data) }) 补充知识:两个不同的路由,引入相同的组件 从不同的按钮进入到详情页,两个不同的路由,相同的组件 主要是从不同按钮进入不同路由的页面,内容一致,但是title不一

随机推荐