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

猜你喜欢

转载自www.cnblogs.com/findumars/p/10332426.html