【QT】学习笔记:处理JSON对象、字符串

在 Qt 中处理 JSON 数据非常方便,Qt 提供了 QJsonDocumentQJsonObjectQJsonArrayQJsonValue 等类来处理 JSON 数据。下面是一个简单的代码示例,演示如何解析 JSON 字符串、修改 JSON 数据并将其转换回字符串。

示例代码

1. JSON 字符串解析

假设我们有以下 JSON 字符串:

复制代码
{
    "name": "John Doe",
    "age": 30,
    "isEmployed": true,
    "skills": ["C++", "Qt", "JSON"],
    "address": {
        "street": "123 Main St",
        "city": "Anytown",
        "country": "Anycountry"
    }
}

我们可以使用 Qt 的 JSON 处理类来解析这个字符串。

2. 解析 JSON 字符串的代码
cpp 复制代码
#include <QCoreApplication>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include <QDebug>

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

    // JSON 字符串
    QString jsonString = R"(
    {
        "name": "John Doe",
        "age": 30,
        "isEmployed": true,
        "skills": ["C++", "Qt", "JSON"],
        "address": {
            "street": "123 Main St",
            "city": "Anytown",
            "country": "Anycountry"
        }
    }
    )";

    // 解析 JSON 字符串
    QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonString.toUtf8());

    // 检查是否解析成功
    if (!jsonDoc.isNull()) {
        qDebug() << "JSON parsed successfully!";
    } else {
        qWarning() << "Failed to parse JSON!";
        return -1;
    }

    // 获取 JSON 对象
    QJsonObject jsonObj = jsonDoc.object();

    // 访问数据
    QString name = jsonObj["name"].toString();
    int age = jsonObj["age"].toInt();
    bool isEmployed = jsonObj["isEmployed"].toBool();
    QJsonArray skills = jsonObj["skills"].toArray();
    QJsonObject address = jsonObj["address"].toObject();

    qDebug() << "Name:" << name;
    qDebug() << "Age:" << age;
    qDebug() << "Employed:" << isEmployed;

    // 输出技能列表
    qDebug() << "Skills:";
    for (const QJsonValue &value : skills) {
        qDebug() << " -" << value.toString();
    }

    // 输出地址信息
    qDebug() << "Address:";
    qDebug() << " Street:" << address["street"].toString();
    qDebug() << " City:" << address["city"].toString();
    qDebug() << " Country:" << address["country"].toString();

    // 修改 JSON 数据
    jsonObj["age"] = 31; // 更新年龄
    jsonObj["skills"].toArray().append("QML"); // 添加一个新技能

    // 将 JSON 对象转换回 JSON 字符串
    QJsonDocument newJsonDoc(jsonObj);
    QString modifiedJsonString = newJsonDoc.toJson(QJsonDocument::Indented);

    qDebug() << "Modified JSON String:" << modifiedJsonString;

    return a.exec();
}

代码说明

  1. 解析 JSON 字符串

    • 使用 QJsonDocument::fromJson 将 JSON 字符串解析为 QJsonDocument
    • 使用 jsonDoc.object() 获取根 QJsonObject,可以从中访问各个键值对。
  2. 访问 JSON 数据

    • 使用 QJsonObject::value(key) 获取值,并根据需要将其转换为相应的类型(如 QStringintbool 等)。
    • 使用 QJsonArray 访问数组中的元素。
  3. 修改 JSON 数据

    • 通过赋值更新 JSON 对象中的键值对。
    • 使用 QJsonArray::append 方法向数组中添加新元素。
  4. 转换回 JSON 字符串

    • 使用 QJsonDocument::toJsonQJsonObject 转换回 JSON 字符串,QJsonDocument::Indented 参数用于生成带缩进的格式化字符串。

运行结果

cpp 复制代码
JSON parsed successfully!
Name: "John Doe"
Age: 30
Employed: true
Skills:
 - "C++"
 - "Qt"
 - "JSON"
Address:
 Street: "123 Main St"
 City: "Anytown"
 Country: "Anycountry"
Modified JSON String: "{
    "name": "John Doe",
    "age": 31,
    "isEmployed": true,
    "skills": [
        "C++",
        "Qt",
        "JSON",
        "QML"
    ],
    "address": {
        "street": "123 Main St",
        "city": "Anytown",
        "country": "Anycountry"
    }
}"

总结

通过这个示例,你学会了如何在 Qt 中解析、访问、修改和生成 JSON 数据。Qt 提供的 JSON 处理类非常直观,使用这些类可以轻松地处理复杂的 JSON 结构。

相关推荐
Risehuxyc1 天前
前端同学,你能不能别再往后端传一个巨大的JSON了?
前端·json·状态模式
逢五必更2 天前
从json中提取i18n字段
json
二楼后座。3 天前
Golang操作MySQL json字段优雅写法
mysql·golang·json
wtsolutions4 天前
Excel to JSON API by WTSolution Documentation
json·excel·api·wtsolutions
面朝大海,春不暖,花不开5 天前
结构化数据格式解析:JSON 与 XML 的技术应用与实践
xml·json
PythonicCC6 天前
Django核心知识点详解:JSON、AJAX、Cookie、Session与用户认证
ajax·django·json
-凌凌漆-6 天前
【Qt】Qt QML json处理
开发语言·qt·json
racerun6 天前
UniApp中的pages.json 和 tabBar
uni-app·json
我命由我123457 天前
前端开发问题:SyntaxError: “undefined“ is not valid JSON
开发语言·前端·javascript·vue.js·json·ecmascript·js
Code季风7 天前
将 gRPC 服务注册到 Consul:从配置到服务发现的完整实践(上)
数据库·微服务·go·json·服务发现·consul