• Qt JSON解析生成笔记(把JSON转成一个类对象)


    对于这样一段json

    复制代码
    {
      "name": "布衣食",
      "gender": "Male",
      "age": 25,
      "attribute": {
        "skill": "Programming",
        "languages": [ "C", "C++", "Java" ],
        "frameworks": [ "Qt", "Android" ]
      }
    }
    复制代码

    我希望把它转换为一个Programmer对象,Programmer的声明如下

    Programmer.h

    复制代码
    #ifndef PROGRAMMER_H
    #define PROGRAMMER_H
    
    #include <QString>
    #include <QList>
    class Programmer
    {
    public:
        class Attribute
        {
        public:
            Attribute(const QString &skill, const QList<QString> &languages, const QList<QString> &frameworks);
            const QString &getSkill() const;
            const QList<QString> &getLanguages() const;
            const QList<QString> &getFrameworks() const;
        private:
            QString skill;
            QList<QString> languages;
            QList<QString> frameworks;
        };
        Programmer(const QString &name, const QString &gender, int age, Attribute attribute);
        const QString &getName() const;
        const QString &getGender() const;
        int getAge() const;
        const Attribute &getAttribute() const;
        QString toJson() const;
        static Programmer fromJson(const QString &json);
    private:
        QString name;
        QString gender;
        int age;
        Attribute attribute;
    };
    
    #endif // PROGRAMMER_H
    复制代码

    在Java中,使用第三方库GSON就可以方便地实现对象和json之间的转换;而C++没有反射机制,所以没有类似的库。

    于是,我只好自行编写转换代码,如下

    将json转换为Programmer对象

    复制代码
    Programmer Programmer::fromJson(const QString &json)
    {
        QJsonParseError error;
        const QJsonDocument &document = QJsonDocument::fromJson(json.toUtf8(), &error);
        if (QJsonParseError::NoError == error.error)
        {
            const QJsonObject &programmerObject = document.object();
            const QString &name = programmerObject.value(QStringLiteral("name")).toString();
            const QString &gender = programmerObject.value(QStringLiteral("gender")).toString();
            int age = programmerObject.value(QStringLiteral("age")).toInt();
            const QJsonObject &attributeObject = programmerObject.value(QStringLiteral("attribute")).toObject();
            const QString &skill = attributeObject.value(QStringLiteral("skill")).toString();
            const QJsonArray &languagesArray = attributeObject.value(QStringLiteral("languages")).toArray();
            QList<QString> languages;
            for (const QJsonValue &value : languagesArray)
            {
                languages.append(value.toString());
            }
            const QJsonArray &frameworksArray = attributeObject.value(QStringLiteral("frameworks")).toArray();
            QList<QString> frameworks;
            for (const QJsonValue &value : frameworksArray)
            {
                frameworks.append(value.toString());
            }
            return Programmer(name, gender, age, Attribute(skill, languages, frameworks));
        }
        throw error.errorString();
    }
    复制代码

    将Programmer对象转换为json

    复制代码
    QString Programmer::toJson() const
    {
        QJsonObject programmerObject;
        programmerObject.insert(QStringLiteral("name"), name);
        programmerObject.insert(QStringLiteral("gender"), gender);
        programmerObject.insert(QStringLiteral("age"), age);
        QJsonObject attributeObject;
        attributeObject.insert(QStringLiteral("skill"), attribute.getSkill());
        QJsonArray languagesArray;
        for (const QString &s : attribute.getLanguages())
        {
            languagesArray.append(s);
        }
        attributeObject.insert(QStringLiteral("languages"), languagesArray);
        QJsonArray frameworksArray;
        for (const QString &s : attribute.getFrameworks())
        {
            frameworksArray.append(s);
        }
        attributeObject.insert(QStringLiteral("frameworks"), frameworksArray);
        programmerObject.insert(QStringLiteral("attribute"), attributeObject);
        return QJsonDocument(programmerObject).toJson();
    }
    复制代码

    编写这样的代码,枯燥费时,但我目前没有更好的解决方案。

    https://www.cnblogs.com/buyishi/p/10306551.html

  • 相关阅读:
    Java系列: JAVA字符串格式化-String.format()的使用(zz)
    Eclipse系列: 在Eclipse中用TODO标签管理任务(Task)(ZZ)
    JNDI全面总结(zz)
    Java Platform Standard Edition 8 Documentation
    JAVA NIO是什么(zz)
    Java NIO框架Mina、Netty、Grizzly介绍与对比(zz)
    Bootstrap系列 -- 25. 下拉菜单分割线
    Bootstrap系列 -- 24. 下拉菜单基本用法
    Bootstrap系列 -- 23. 图片
    Bootstrap系列 -- 22. 按钮详解
  • 原文地址:https://www.cnblogs.com/findumars/p/10332426.html
Copyright © 2020-2023  润新知