對於這樣一段jsonhtml
{ "name": "布衣食", "gender": "Male", "age": 25, "attribute": { "skill": "Programming", "languages": [ "C", "C++", "Java" ], "frameworks": [ "Qt", "Android" ] } }
我但願把它轉換爲一個Programmer對象,Programmer的聲明以下json
Programmer.happ
#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++沒有反射機制,因此沒有相似的庫。spa
因而,我只好自行編寫轉換代碼,以下code
將json轉換爲Programmer對象htm
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(); }
編寫這樣的代碼,枯燥費時,但我目前沒有更好的解決方案。blog
https://www.cnblogs.com/buyishi/p/10306551.htmlget