qt html解析json,Qt JSON解析生成笔记(把JSON转成一个类对象)

对于这样一段json

48304ba5e6f9fe08f3fa1abda7d326ab.png

{

"name": "布衣食",

"gender": "Male",

"age": 25,

"attribute": {

"skill": "Programming",

"languages": [ "C", "C++", "Java" ],

"frameworks": [ "Qt", "Android" ]

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

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

Programmer.h

48304ba5e6f9fe08f3fa1abda7d326ab.png

#ifndef PROGRAMMER_H

#define PROGRAMMER_H

#include

#include

class Programmer

{

public:

class Attribute

{

public:

Attribute(const QString &skill, const QList &languages, const QList &frameworks);

const QString &getSkill() const;

const QList &getLanguages() const;

const QList &getFrameworks() const;

private:

QString skill;

QList languages;

QList 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

48304ba5e6f9fe08f3fa1abda7d326ab.png

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

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

将json转换为Programmer对象

48304ba5e6f9fe08f3fa1abda7d326ab.png

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 languages;

for (const QJsonValue &value : languagesArray)

{

languages.append(value.toString());

}

const QJsonArray &frameworksArray = attributeObject.value(QStringLiteral("frameworks")).toArray();

QList frameworks;

for (const QJsonValue &value : frameworksArray)

{

frameworks.append(value.toString());

}

return Programmer(name, gender, age, Attribute(skill, languages, frameworks));

}

throw error.errorString();

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

将Programmer对象转换为json

48304ba5e6f9fe08f3fa1abda7d326ab.png

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();

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值