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

Stella981
• 阅读 960

对于这样一段json

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

{
  "name": "布衣食",
  "gender": "Male",
  "age": 25,
  "attribute": {
    "skill": "Programming",
    "languages": [ "C", "C++", "Java" ],
    "frameworks": [ "Qt", "Android" ]
  }
}

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

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

Programmer.h

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

#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

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

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

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

将json转换为Programmer对象

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

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

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

将Programmer对象转换为json

Qt JSON解析生成笔记(把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();
}

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

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

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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
List的Select 和Select().tolist()
List<PersondelpnewList<Person{newPerson{Id1,Name"小明1",Age11,Sign0},newPerson{Id2,Name"小明2",Age12,
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Gson之实例五
前面四篇博客基本上可以满足我们处理的绝大多数需求,但有时项目中对json有特殊的格式规定.比如下面的json串解析:{"tableName":"students","tableData":{"id":1,"name":"李坤","birthDay":"Jun 22, 2012 9:54:49 PM"},{"id":2,"name":"曹贵生"
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这