【Qt】Json解析

前言

        Json是一种常用的数据格式,它有多种用途:

数据交换JSON是一种使用广泛的数据格式,用于在客户端和服务器之间传输数据。它可以用来序列化和反序列化数据,使不同系统之间能够轻松地交换和共享数据。
配置文件许多应用程序使用JSON格式来存储和读取配置信息。这样可以以结构化的方式组织配置数据,并且可以轻松地修改和更新配置。
API通信许多Web和移动应用程序使用JSON来作为API的数据格式。服务器将数据以JSON的形式返回给客户端,客户端则可以解析JSON数据并使用其中的数据。
存储和传输非结构化数据JSON可以灵活地存储和传输非结构化的数据,例如日志文件、日程安排、电子邮件等。它提供了一种简单的方式来组织和存储这些数据。
数据持久化许多NoSQL数据库(如MongoDB)使用JSON作为存储数据的格式。JSON格式可以灵活地定义数据结构,使数据的存储和查询更加方便。
配置API请求和响应JSON可以用来描述API请求和响应的结构。可以定义请求的参数和期望的响应格式,并将其包装在JSON对象中。

        它是一种轻量级的、开放的、易于阅读和理解的数据格式,适用于广泛的应用场景。 正是由于Json格式的数据的常用性,所以很多时候我们使用Qt框架来写程序是绕不开它的。而Qt自然也有专门的类用来读写Json格式的数据。

Qt中用于解析Json的类

QJsonDocumentQJsonDocument类提供了从Json数据到内存表示的功能,以及从内存表示到Json数据的功能;可以使用fromJson()函数将Json数据加载到QJsonDocument对象中,使用toJson()函数将QJsonDocument对象转换为Json数据。
QJsonArrayQJsonArray类表示一个Json数组。它可以存储不同类型的值,例如字符串、整数、浮点数、布尔值、对象和其他数组。
QJsonObjectQJsonObject类表示一个Json对象。它存储键值对。可以使用insert()函数将键值对插入对象,使用value()函数获取特定键对应的值,使用contains()函数判断对象是否包含某个键。
QJsonValueQJsonValue类是所有Json值(字符串、整数、浮点数、布尔值、数组、对象和空值)的基类。可以使用类型相关的函数(例如toString()、toInt()、toDouble())将QJsonValue对象转换为相应类型的值。
QJsonParseErrorQJsonParseError类包含了关于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
  • 35
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于在Qt中进行JSON数据解析,您可以使用Qt提供的QJsonDocument和QJsonObject类来实现。下面是一个简单的示例代码,演示了如何解析JSON数据: ```cpp #include <QCoreApplication> #include <QJsonDocument> #include <QJsonObject> #include <QJsonArray> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 示例JSON数据 QByteArray jsonData = R"( { "name": "John", "age": 30, "city": "New York", "languages": ["C++", "Python", "JavaScript"] })"; // 解析JSON数据 QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData); if (!jsonDoc.isNull()) { if (jsonDoc.isObject()) { QJsonObject jsonObj = jsonDoc.object(); // 获取字段值 QString name = jsonObj["name"].toString(); int age = jsonObj["age"].toInt(); QString city = jsonObj["city"].toString(); // 获取数组值 QJsonArray languagesArray = jsonObj["languages"].toArray(); QStringList languages; for (const QJsonValue& value : languagesArray) { languages.append(value.toString()); } // 打印结果 qDebug() << "Name:" << name; qDebug() << "Age:" << age; qDebug() << "City:" << city; qDebug() << "Languages:" << languages; } } return a.exec(); } ``` 在这个示例中,我们首先创建了一个QByteArray来存储JSON数据。然后,我们使用QJsonDocument::fromJson()方法将JSON数据转换为QJsonDocument对象。接下来,我们判断QJsonDocument对象是否为有效的JSON对象,并使用QJsonObject类获取字段值和数组值。 希望这个示例能对您有所帮助!如果您有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值