zoukankan      html  css  js  c++  java
  • Qt 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();
    }

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

  • 相关阅读:
    不要试图给Password类型的TextBox赋值!
    asp.net与javacript之间的通讯
    这个iframe有点奇怪
    C#的异常处理机制 (转载)
    公匙算法.电子签名
    西煞魄工厂的入门教程
    Web services and SOAP
    观察者模式
    WebService:使用 Soap 标头自定义身份验证和授权(转载)
    社会型网络(3)-回到现实(转载)
  • 原文地址:https://www.cnblogs.com/buyishi/p/10306551.html
Copyright © 2011-2022 走看看