JSON 用于存储结构化的数据,存储的格式为:bool、double、string、array、object、null等6种格式。bool 值用“true/false”表示, double 支持双精度;string 代表字符串;array 数组是列表,用方括号“[]”表示;object 对象是“键值对”组合,并且都是字符串,不能包含重复的 key,用大括号“{}”表示。JSON中的每条都用逗号隔开。如下是一个示例:
"
Time
"
:
10
,
"
Win10
"
:
true
,
"
ComputerType
"
:
"
Lenovo
"
,
"
Hardware
"
: {
"
CPU
"
:
"
3.0GHZ
"
,
"
Processor
"
:
"
i7-9700F
"
,
"
RAM
"
:
"
16GB
"
"
Windows
"
: {
"
Version
"
:
"
Windows10
"
,
"
VersionNumber
"
:
"
21H2
"
,
"
InstallDate
"
:
"
2022/04/28
"
"
Software
"
: [
"
Office
"
,
"
Photoshop
"
"
UserName
"
: {
以上是常见6种存储格式,且Qt中的JSON类可分为QJsonValue(封装JSON值)、QJsonArray(封装JSON数组)、QJsonObject(封装JSON对象)、QJsonDocument(封住JSON文档)、QJsonParseError(解析JSON时的错误)等类。
二、构建JSON对象
//构建复杂JSON字符串
QJsonObject winObject;
winObject.insert("Version", "Windows10");
winObject.insert("VersionNumber", "21H2");
winObject.insert("InstallDate", "2022/04/28");
QJsonObject hardObject;
hardObject.insert("CPU", "3.0GHZ");
hardObject.insert("Processor", "i7-9700F");
hardObject.insert("RAM", "16GB");
hardObject.insert("Windows", QJsonValue(winObject));
//构建JSON数组
QJsonArray jsonArray;
jsonArray.append("Office");
jsonArray.append("Photoshop");
//构建JSON对象
QJsonObject object;
object.insert("Time", 10);
object.insert("Win10", true);
object.insert("ComputerType", "Lenovo");
object.insert("UserName", QJsonObject()); //构建空json
object.insert("Hardware", QJsonValue(hardObject));
object.insert("Software", QJsonValue(jsonArray));
QJsonDocument document;
document.setObject(object);
m_arrayJson = document.toJson(QJsonDocument::Compact);
三、解析JSON对象
QString array;
QJsonParseError jsonError;
QJsonDocument document = QJsonDocument::fromJson(m_arrayJson, &jsonError);
if (!document.isNull() && (QJsonParseError::NoError == jsonError.error)) {
//解析JSON对象
if (document.isObject()) {
QJsonObject object = document.object();
if (object.contains("Time")) {
QJsonValue value = object.take("Time");
if (value.isDouble()) {
int nTime = value.toVariant().toInt();
array.append(QString("Time : %1; ").arg(nTime));
if (object.contains("Win10")) {
QJsonValue value = object.take("Win10");
if (value.isBool()) {
bool bWin10= value.toVariant().toBool();
array.append(QString("Win10 : %1; ").arg(bWin10));
if (object.contains("ComputerType")) {
QJsonValue value = object.take("ComputerType");
if (value.isString()) {
QString strType = value.toVariant().toString();
array.append(QString("ComputerType : %1; ").arg(strType));
//解析JSON数组
if (object.contains("Software")) {
QJsonValue value = object.take("Software");
if (value.isArray()) {
QJsonArray arrayJson = value.toArray();
for (int var = 0; var < arrayJson.size(); ++var) {
value = arrayJson.at(var);
if (value.isString()) {
QString strOffice = value.toString();
if (var > 0) {
array.append(QString("%1; ").arg(strOffice));
} else {
array.append(QString("Software: %1, ").arg(strOffice));
//解析复杂JSON字符串
if (object.contains("Hardware")) {
QJsonValue hardValue = object.take("Hardware");
if (hardValue.isObject()) {
QJsonObject harObject = hardValue.toObject();
if (harObject.contains("Windows")) {
QJsonValue winValue = harObject.take("Windows");
if (winValue.isObject()) {
QJsonObject winObject = winValue.toObject();
if (winObject.contains("Version")) {
QJsonValue verJson = winObject.take("Version");
if (verJson.isString()) {
QString strVer = verJson.toVariant().toString();
array.append(QString("Version : %1, ").arg(strVer));
if (harObject.contains("CPU")) {
QJsonValue value = harObject.take("CPU");
if (value.isString()) {
QString strCPU = value.toVariant().toString();
array.append(QString("CPU : %1").arg(strCPU));
m_editParse->setText(array);
结果如下图所示
四、JSON数组的解析
"
cid
"
:
"
CN01
"
,
"
city
"
:
"
北京
"
,
"
nation
"
:
"
中国
"
,
"
cid
"
:
"
US02
"
,
"
city
"
:
"
华盛顿
"
,
"
nation:
"
"
美国
"
json数组示例一:
QJsonObject cn_json;
cn_json.insert("cid", "CN01");
cn_json.insert("city", "beijing");
cn_json.insert("nation", "china");
QJsonObject us_json;
us_json.insert("cid", "US02");
us_json.insert("city", "washington");
us_json.insert("nation", "us");
QJsonArray array;
array.append(QJsonValue(cn_json));
array.append(QJsonValue(us_json));
QByteArray data = QJsonDocument(array).toJson(QJsonDocument::Compact);
json数组解析
QJsonParseError jsonError;
QJsonDocument document = QJsonDocument::fromJson(data, &jsonError);
if (jsonError.error == QJsonParseError::NoError) {
QVariantList list = document.toVariant().toList();
foreach (QVariant variant, list) {
qDebug() << "cid:" << variant.toMap()["cid"].toString();
qDebug() << "city:" << variant.toMap()["city"].toString();
qDebug() << "nation:" << variant.toMap()["nation"].toString();
json数组示例二:
QJsonObject json_1;
json_1.insert("id", "20230402221529");
QJsonObject json_2;
json_2.insert("id", "20230402203158");
QJsonObject json_3;
json_3.insert("id", "20230402175752");
QJsonArray array;
array.append(QJsonValue(json_1));
array.append(QJsonValue(json_2));
array.append(QJsonValue(json_3));
QJsonObject json;
json.insert("data", QJsonValue(array));
QByteArray data = QJsonDocument(json).toJson(QJsonDocument::Compact);
qDebug() << "data:" << data;
json数组解析
QJsonParseError jsonError;
QJsonDocument json_doc = QJsonDocument::fromJson(data, &jsonError);
if (jsonError.error == QJsonParseError::NoError) {
QJsonObject root_obj = json_doc.object();
if (root_obj.contains("data")) {
QJsonValue json_value = root_obj.value("data");
if (json_value.isArray()) {
QJsonArray array = json_value.toArray();
for (int i = 0; i < array.size(); ++i) {
QJsonValue id_value = array.at(i);
if (id_value.isObject()) {
QJsonObject id_object = id_value.toObject();
qDebug() << "id:" << id_object.take("id").toVariant().toString();
//QString id = id_object["id"].toString();
//qDebug() << "id:" << id;