Qt对json生成与解析的封装

#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QVariantMap>
#include <QVariantList>

class JsonHelper
{
public:
    static QString generateJson(const QVariantMap& data)
    {
        QJsonObject jsonObject = jsonObjectFromVariantMap(data);
        QJsonDocument jsonDoc(jsonObject);
        return jsonDoc.toJson(QJsonDocument::Compact);
    }

    static QVariantMap parseJson(const QString& jsonString)
    {
        QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonString.toUtf8());
        if (!jsonDoc.isNull())
        {
            QJsonValue rootValue = jsonDoc.object();
            if (rootValue.isObject())
            {
                return variantMapFromJsonObject(rootValue.toObject());
            }
            else if (rootValue.isArray())
            {
                QVariantMap map;
                map["array"] = variantListFromJsonArray(rootValue.toArray());
                return map;
            }
        }

        return QVariantMap();
    }

private:
    static QJsonObject jsonObjectFromVariantMap(const QVariantMap& variantMap)
    {
        QJsonObject jsonObject;
        for (const QString& key : variantMap.keys())
        {
            const QVariant& variant = variantMap.value(key);
            switch (variant.type())
            {
                case QVariant::Map:
                    jsonObject[key] = jsonObjectFromVariantMap(variant.toMap());
                    break;
                case QVariant::List:
                    jsonObject[key] = jsonArrayFromVariantList(variant.toList());
                    break;
                case QVariant::String:
                    jsonObject[key] = variant.toString();
                    break;
                case QVariant::Int:
                case QVariant::Double:
                    jsonObject[key] = variant.toDouble();
                    break;
                case QVariant::Bool:
                    jsonObject[key] = variant.toBool();
                    break;
                default:
                    break;
            }
        }
        return jsonObject;
    }

    static QJsonArray jsonArrayFromVariantList(const QVariantList& variantList)
    {
        QJsonArray jsonArray;
        for (const QVariant& variant : variantList)
        {
            switch (variant.type())
            {
                case QVariant::Map:
                    jsonArray.append(jsonObjectFromVariantMap(variant.toMap()));
                    break;
                case QVariant::List:
                    jsonArray.append(jsonArrayFromVariantList(variant.toList()));
                    break;
                case QVariant::String:
                    jsonArray.append(variant.toString());
                    break;
                case QVariant::Int:
                case QVariant::Double:
                    jsonArray.append(variant.toDouble());
                    break;
                case QVariant::Bool:
                    jsonArray.append(variant.toBool());
                    break;
                default:
                    break;
            }
        }
        return jsonArray;
    }

    static QVariantMap variantMapFromJsonObject(const QJsonObject& jsonObject)
    {
        QVariantMap variantMap;
        for (const QString& key : jsonObject.keys())
        {
            const QJsonValue& jsonValue = jsonObject.value(key);
            if (jsonValue.isObject())
            {
                variantMap[key] = variantMapFromJsonObject(jsonValue.toObject());
            }
            else if (jsonValue.isArray())
            {
                variantMap[key] = variantListFromJsonArray(jsonValue.toArray());
            }
            else if (jsonValue.isString())
            {
                variantMap[key] = jsonValue.toString();
            }
            else if (jsonValue.isDouble())
            {
                variantMap[key] = jsonValue.toDouble();
            }
            else if (jsonValue.isBool())
            {
                variantMap[key] = jsonValue.toBool();
            }
        }
        return variantMap;
    }

    static QVariantList variantListFromJsonArray(const QJsonArray& jsonArray)
    {
        QVariantList variantList;
        for (const QJsonValue& jsonValue : jsonArray)
        {
            if (jsonValue.isObject())
            {
                variantList.append(variantMapFromJsonObject(jsonValue.toObject()));
            }
            else if (jsonValue.isArray())
            {
                variantList.append(variantListFromJsonArray(jsonValue.toArray()));
            }
            else if (jsonValue.isString())
            {
                variantList.append(jsonValue.toString());
            }
            else if (jsonValue.isDouble())
            {
                variantList.append(jsonValue.toDouble());
            }
            else if (jsonValue.isBool())
            {
                variantList.append(jsonValue.toBool());
            }
        }
        return variantList;
    }
};

现在JsonHelper类具备了生成和解析JSON的功能。你可以使用generateJson方法来将QVariantMap转换为JSON字符串,使用parseJson方法将JSON字符串解析为QVariantMap。

下面是使用示例:

QVariantMap data;
data["name"] = "John Doe";
data["age"] = 30;
data["isStudent"] = true;
QVariantList hobbies;
hobbies.append("reading");
hobbies.append("gaming");
hobbies.append("coding");
data["hobbies"] = hobbies;

// 生成JSON数据
QString jsonString = JsonHelper::generateJson(data);

// 解析JSON数据
QVariantMap parsedJson = JsonHelper::parseJson(jsonString);

// 读取解析后的数据
QString name = parsedJson["name"].toString();
int age = parsedJson["age"].toInt();
bool isStudent = parsedJson["isStudent"].toBool();
QVariantList parsedHobbies = parsedJson["hobbies"].toList();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值