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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM