下面将为您详细讲解在C/C++ Qt中运用JSON解析库的实例代码的完整攻略。
一、JSON简介
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON建立在两种结构上:一个用来表示值的简单原始类型(数字、字符串、布尔值、空值)以及一种集合值的有序列表(数组)和一个包含属性的名称/值对的各异性集(对象)。
关于JSON的更多详细信息,请参考 JSON官方网站。
二、Qt的JSON解析库
在C/C++ Qt中,使用JSON解析库需要引用Qt的<QtJson/QtJson>头文件,并调用库提供的类来解析JSON格式数据。
三、JSON解析类
Qt提供了两个JSON解析类:QJsonParseError和QJsonDocument。
- QJsonParseError
QJsonParseError类表示JSON解析过程中发生的出错信息。当调用QJsonDocument::fromJson()方法解析JSON格式数据时,如果解析过程中发生错误,则返回一个QJsonParseError对象,该对象包含了出错的相关信息。
QJsonParseError类定义在头文件<QJsonParseError>中,其主要成员包括error,offset和errorString。
-
error:一个枚举类型值,描述了错误类型。可能的值包括如下项:
- QJsonParseError::NoError:表示没有错误
- QJsonParseError::UnterminatedObject:表示对象/数组没有正常结束
- QJsonParseError::MissingNameSeparator:表示属性缺少冒号分隔符
- QJsonParseError::UnterminatedArray:表示数组元素没有正常结束
- QJsonParseError::ValueInvalid:表示值无效
- QJsonParseError::TerminationByNumber:表示数字以意外的字符终止
- QJsonParseError::IllegalValue:表示值不是字符串、数字、对象、数组或布尔值
- QJsonParseError::TerminationByToken:表示未正确关闭字符串或注释
- QJsonParseError::ObjectNotEmpty:表示对象中有重复的名称
- QJsonParseError::InvalidEscapeSequence:表示字符串中有无效的转义序列
- QJsonParseError::MissingValueSeparator:表示属性缺少逗号分隔符
- QJsonParseError::DeepNesting:表示JSON的嵌套层数过深
- QJsonParseError::DocumentTooLarge:表示解析的JSON文档超过预定义的限制
-
offset:表示错误信息出现的位置。
-
errorString:包含错误信息的字符串。
-
QJsonDocument
QJsonDocument类表示JSON格式的文档对象。通常,QJsonDocument类的实例表示QJsonObject或QJsonArray对象的根元素。该类提供了两种从JSON格式的字符串和Qt数据类型之间进行转换的静态成员函数:
函数名称 | 说明 |
---|---|
QJsonDocument.fromJson(const QByteArray &data, QJsonParseError *error = nullptr) |
将包含JSON格式的data转换成QJsonDocument对象,并返回转换结果。如果出现解析错误,则通过error参数返回错误信息。 |
QByteArray QJsonDocument.toJson(QJsonDocument::JsonFormat format = QJsonDocument::Indented) |
将QJsonDocument对象转换成JSON格式的字符串,并返回转换结果。format参数指定了JSON格式的输出方式:Indented表示以缩进格式输出,Compact表示以紧凑格式输出。 |
四、JSON解析实例
这里给出两个解析JSON数据的例子:
示例一:解析JSON格式的数据
示例JSON数据:
{
"name": "Tom",
"age": 24,
"married": false,
"hobbies":["music","swimming","reading"],
"address": {
"province":"Guangdong",
"city":"Shenzhen",
"street":"Nanshan"
}
}
代码如下:
#include <QJsonDocument>
#include <QJsonObject>
#include <QDebug>
int main()
{
QString json = "{\"name\":\"Tom\",\"age\":24,\"married\":false,\"hobbies\":[\"music\",\"swimming\",\"reading\"],\"address\":{\"province\":\"Guangdong\",\"city\":\"Shenzhen\",\"street\":\"Nanshan\"}}";
QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8(), &error);
if (error.error != QJsonParseError::NoError)
{
qDebug() << "Parse error: " << error.errorString();
}
QJsonObject obj = doc.object();
qDebug() << "name: " << obj["name"].toString();
qDebug() << "age: " << obj["age"].toInt();
qDebug() << "married: " << obj["married"].toBool();
QJsonArray hobbies = obj["hobbies"].toArray();
qDebug() << "hobbies: ";
foreach(QJsonValue hobby, hobbies)
{
qDebug() << " " << hobby.toString();
}
QJsonObject address = obj["address"].toObject();
qDebug() << "address: " << address["province"].toString() << address["city"].toString() << address["street"].toString();
return 0;
}
运行结果为:
name: "Tom"
age: 24
married: false
hobbies:
"music"
"swimming"
"reading"
address: "Guangdong" "Shenzhen" "Nanshan"
示例二:从文件读取JSON数据
示例JSON文件:data.json
{
"name": "John",
"age": 33,
"married": true,
"hobbies":["football","basketball","baseball"],
"address": {
"province":"Guangxi",
"city":"Nanning",
"street":"Chengbei"
}
}
代码如下:
#include <QJsonDocument>
#include <QJsonObject>
#include <QDebug>
#include <QFile>
int main()
{
QFile file("data.json");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
qDebug() << "Cannot open file for reading.";
return -1;
}
QString json = file.readAll();
file.close();
QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8(), &error);
if (error.error != QJsonParseError::NoError)
{
qDebug() << "Parse error: " << error.errorString();
}
QJsonObject obj = doc.object();
qDebug() << "name: " << obj["name"].toString();
qDebug() << "age: " << obj["age"].toInt();
qDebug() << "married: " << obj["married"].toBool();
QJsonArray hobbies = obj["hobbies"].toArray();
qDebug() << "hobbies: ";
foreach(QJsonValue hobby, hobbies)
{
qDebug() << " " << hobby.toString();
}
QJsonObject address = obj["address"].toObject();
qDebug() << "address: " << address["province"].toString() << address["city"].toString() << address["street"].toString();
return 0;
}
运行结果和上一示例相同。
以上就是关于C/C++ Qt运用JSON解析库的实例代码的完整攻略,希望对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C/C++ Qt 运用JSON解析库的实例代码 - Python技术站