Qt构建与解析Json示例

本文以BeJson(https://www.bejson.com/)中的JSON在线编辑器示例内容作为学习Qt中构建、解析Json的参考方法。

1、Json文本

{
    "name": "BeJson",
    "url": "http://www.bejson.com",
    "page": 88,
    "isNonProfit": true,
    "address": {
        "city": "江苏苏州",
        "country": "中国",
        "street": "科技园路"
    },
    "links": [
        {
            "name": "Google",
            "url": "http://www.google.com"
        },
        {
            "name": "Baidu",
            "url": "http://www.baidu.com"
        },
        {
            "name": "SoSo",
            "url": "http://www.SoSo.com"
        }
    ]
}

2、构建、解析代码

#include <QtCore/QCoreApplication>
#include <QDir>
#include <QFile>

#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonValue>

void writeJson()
{
    QJsonObject rootObject;

    //1.插入name、url、page、isNonProfit字段
    rootObject.insert("name", "BeJson");
    rootObject.insert("url", "http://www.bejson.com");
    rootObject.insert("page", 88);
    rootObject.insert("isNonProfit", true);

    //2.插入address字段
    QJsonObject addressObject;
    addressObject.insert("street", "科技园路");
    addressObject.insert("city", "江苏苏州");
    addressObject.insert("country", "中国");

    rootObject.insert("address", addressObject);

    //3.插入links字段
    QJsonArray linkArray;

    //Google
    QJsonObject linkGoogleObject;
    linkGoogleObject.insert("name", "Google");
    linkGoogleObject.insert("url", "http://www.google.com");

    //Baidu
    QJsonObject linkBaiduObject;
    linkBaiduObject.insert("name", "Baidu");
    linkBaiduObject.insert("url", "http://www.baidu.com");

    //SoSo
    QJsonObject linkSoSoObject;
    linkSoSoObject.insert("name", "SoSo");
    linkSoSoObject.insert("url", "http://www.SoSo.com");

    linkArray.append(linkGoogleObject);
    linkArray.append(linkBaiduObject);
    linkArray.append(linkSoSoObject);

    rootObject.insert("links", linkArray);

    //4.将rootObject转换为字符串
    QJsonDocument doc(rootObject);
    QByteArray json = doc.toJson();

    //打印输出
    qDebug() << QString(json).toUtf8().data();

    //5.将json字符串写入文件
    QString dirPath = QCoreApplication::applicationDirPath();
    QString path = QDir::cleanPath(dirPath + QDir::separator() + "bejson.json");
    QFile file(path);
    file.open(QFile::WriteOnly);
    file.write(json);
    file.close();
}

void readJson()
{
    //1.从文件读取json字符串
    QString dirPath = QCoreApplication::applicationDirPath();
    QString path = QDir::cleanPath(dirPath + QDir::separator() + "bejson.json");
    QFile file(path);
    file.open(QFile::ReadOnly);
    QByteArray json = file.readAll();
    file.close();

    //2.解析json字符串
    QJsonDocument doc = QJsonDocument::fromJson(json);
    if (!doc.isObject())
    {
        qDebug() << "Not an object";
        return;
    }

    QJsonObject rootObject = doc.object();
    QStringList keys = rootObject.keys();
    for (int i=0; i<keys.size(); i++)
    {
        QString key = keys[i];
        QJsonValue value = rootObject.value(key);

        if (value.isBool())
        {
            qDebug() << key << ":" << value.toBool();
        }
        else if (value.isString())
        {
            qDebug() << key << ":" << value.toString();
        }
        else if (value.isDouble())
        {
            qDebug() << key << ":" << value.toDouble();
        }
        else if (value.isObject())
        {
            qDebug() << key << ":";

            QJsonObject addressObject = value.toObject();
            QString street = addressObject["street"].toString();
            QString city = addressObject["city"].toString();
            QString country = addressObject["country"].toString();

            qDebug() << "    street: " << street;
            qDebug() << "    city: " << city;
            qDebug() << "    country: " << country;
        }
        else if (value.isArray())
        {
            qDebug() << key << ":";

            QJsonArray linksArray = value.toArray();
            for (int i=0; i<linksArray.size(); i++)
            {
                QJsonObject provinceObject = linksArray[i].toObject();
                QString name = provinceObject["name"].toString();
                QString url = provinceObject["url"].toString();

                qDebug() << "    name: " << name << ", url: " << url;
            }
        }
    }
}
posted @ 2024-11-11 23:10  xhubobo  阅读(15)  评论(0编辑  收藏  举报