前言
Json是一种常用的数据格式,它有多种用途:
数据交换 | JSON是一种使用广泛的数据格式,用于在客户端和服务器之间传输数据。它可以用来序列化和反序列化数据,使不同系统之间能够轻松地交换和共享数据。 |
配置文件 | 许多应用程序使用JSON格式来存储和读取配置信息。这样可以以结构化的方式组织配置数据,并且可以轻松地修改和更新配置。 |
API通信 | 许多Web和移动应用程序使用JSON来作为API的数据格式。服务器将数据以JSON的形式返回给客户端,客户端则可以解析JSON数据并使用其中的数据。 |
存储和传输非结构化数据 | JSON可以灵活地存储和传输非结构化的数据,例如日志文件、日程安排、电子邮件等。它提供了一种简单的方式来组织和存储这些数据。 |
数据持久化 | 许多NoSQL数据库(如MongoDB)使用JSON作为存储数据的格式。JSON格式可以灵活地定义数据结构,使数据的存储和查询更加方便。 |
配置API请求和响应 | JSON可以用来描述API请求和响应的结构。可以定义请求的参数和期望的响应格式,并将其包装在JSON对象中。 |
它是一种轻量级的、开放的、易于阅读和理解的数据格式,适用于广泛的应用场景。 正是由于Json格式的数据的常用性,所以很多时候我们使用Qt框架来写程序是绕不开它的。而Qt自然也有专门的类用来读写Json格式的数据。
Qt中用于解析Json的类
QJsonDocument | QJsonDocument类提供了从Json数据到内存表示的功能,以及从内存表示到Json数据的功能;可以使用fromJson()函数将Json数据加载到QJsonDocument对象中,使用toJson()函数将QJsonDocument对象转换为Json数据。 |
QJsonArray | QJsonArray类表示一个Json数组。它可以存储不同类型的值,例如字符串、整数、浮点数、布尔值、对象和其他数组。 |
QJsonObject | QJsonObject类表示一个Json对象。它存储键值对。可以使用insert()函数将键值对插入对象,使用value()函数获取特定键对应的值,使用contains()函数判断对象是否包含某个键。 |
QJsonValue | QJsonValue类是所有Json值(字符串、整数、浮点数、布尔值、数组、对象和空值)的基类。可以使用类型相关的函数(例如toString()、toInt()、toDouble())将QJsonValue对象转换为相应类型的值。 |
QJsonParseError | QJsonParseError类包含了关于Json解析错误的信息,包括错误类型、错误位置和错误描述。当使用QJsonDocument的fromJson()函数解析Json数据时,如果解析出现问题,可以使用error()函数获取错误信息。 |
读Json
如果是从本机文件中读取Json文件,则需要QFile配合,先用QFile打开Json文件,然后将读取的内容赋予QJsonDocument。
QFile jsonFile("json文件路径");//使用QFile打开Json文件
if(jsonFile.exits()){
jsonFile.open(QIODevice::ReadOnly);//读文件
QByteArray jsonData=jsonFile.readAll();//读取Json文件内容
jsonFile.close();//关闭文件IO
QJsonParseError error; //解析错误反馈
QJsonDocument doc=QJsonDocument::fromJson(jsonData,&error);
if(error.error==QJsonParseError::NoError){
QJsonObject obj=doc.object(); //Json键值对
}
}
在取到QJsonObject之后就可以对Json文件进行解析了,QJsonObject类似于Python的dict,它存储的是键值对,可以使用value()函数取值。
double x = obj.value("x").toDouble();
QString y = obj.value("y").toString();
bool z = obj.value("z").toBool();
int mils = obj.value("mils").toInt();
QJsonObject subObj = obj.value("child").toObject(); //嵌套的键值对
QJsonArray subArray = obj.value("array").toArray(); //列表 内部为QJsonValue
//对于列表的解析如下参考:
for(int i=0;i<subArray.size();i++){
QJsonObject oobj=subArray.at(i).toObject();
}
写Json
写Json可以使用QJsonObject构建Json格式数据,也可以通过QVaraintMap或QVariantHash转为QJsonObject的方式间接构建QJsonObject。
QJsonObject obj;
obj.insert("x",0.111);
obj.insert("y","这是Y");
obj.insert("z",false);
obj.insert("mils",123);
QJsonObject subObj;
obj.insert("child",subObj);
QJsonArray array;
QVaraintList vl;
array.fromVariantList(vl);
同样的,如果需要将Json数据保存到本地,需要QFile配合。先使用QJsonDocument::setObject()将Json数据赋予QJsonDocument,然后将数据存储到文件。
QJsonDocument doc;
doc.setObject(obj);
QByteArray jsonData= doc.toJson(QJsonDocument::Indented);
QFile jsonFile("要保存的路径");
QDir dir = QFileInfo(configfile).dir();
if(!dir.exists()){
dir.mkpath(dir.path());
}
configfile.open(QIODevice::WriteOnly);
configfile.write(jsonData);
configfile.close();
QJsonObject常用方法
fromVariantMap(fromVaraintHash) | 这是一个静态方法,从QVaraintMap创建QJsonObject |
toVariantMap (toVariantHash) | 将QJsonObject转换为QVaraiantMap |
keys | 获取QJsonObject中的所有键(不包含子键)。 |
size (count、length) | 或许QJsonObject中键值对的个数(不包含子键值对) |
isEmpty | 是否为空的QJsonObject |
value | 取值,如果不存在该键,返回一个空的QJsonValue对象。 |
take | 取值,但是取完值就会将这一键值对从Json对象中删除。如果不存在该键,返回一个空的QJsonValue对象。 |
contains | 是否包含某键值对 |
remove | 删除某一键值对 |
QJsonValue常用方法
fromVariant | 静态函数从QVaraint创建QJsonValue。 |
toVariant | 转化为QVariant类型 |
is系列 | isNull、isBool、isDouble等等,判断是否为某一类型。 |
type | 返回类型,为QJsonValue的枚举值,Null、Bool、Double等等 |
to系列 | toBool、toInt、toInteger等等 |
QJsonArray常用方法
fromStringList (fromVariantList) | 静态函数,从QStringList或QVariantList创建QJsonArray |
toVariantList | 将QJsonArray转化为QVariantList |
size (count) | 返回包含的元素个数 |
isEmpty | 是否为空 |
at | 按照索引取值 |
first | 索引为0的元素 |
last | 索引为size-1的元素 |
removeAt | 按照索引删除元素 |
takeAt | 按照索引取值,取完就删掉了该元素 |
insert | 按照索引插入元素 |
replace | 按照索引替换元素 |
contains | 是否包含某QJsonValue |