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
Qt JSON解析生成笔记(把JSON转成一个类对象)的更多相关文章
- Qt JSON解析生成笔记
对于这样一段json { "name": "布衣食", "gender": "Male", "age" ...
- ruby json解析&生成
JSON 通常用于与服务端交换数据. 在接收服务器数据时一般是字符串. 我们可以使用 JSON.parse() 方法将数据转换为 ruby 对象. 一. json字符串解析 require 'json ...
- Android进阶笔记17:3种JSON解析工具(org.json、fastjson、gson)
一. 目前解析json有三种工具:org.json(Java常用的解析),fastjson(阿里巴巴工程师开发的),Gson(Google官网出的),其中解析速度最快的是Gson. 3种json工具下 ...
- Android进阶笔记14:3种JSON解析工具(org.json、fastjson、gson)
一. 目前解析json有三种工具:org.json(Java常用的解析),fastjson(阿里巴巴工程师开发的),Gson(Google官网出的),其中解析速度最快的是Gson. 3种json工具下 ...
- json解析异常 - net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
注:在项目中, 我使用原生的ajax请求数据的时候, JSONObject没能帮我解析, 当却不给我报错, 我是在junit单元测试中测试的时候, 发现的.发现好多时候, 特别是通过ajax请求, 不 ...
- 利用xlrd模块读取excel利用json模块生成相应的json文件的脚本
excel的格式如下 python代码如下,这里最难的就是合并单元格的处理 import xlrd import json excel_obj = xlrd.open_workbook("t ...
- .NET解析xml字符串,通过反射给实体类对象赋值,获取实体类数据列表
/// <summary> /// 解析xml字符串 转换为实体类列表数据 /// </summary> /// <param name="xmlStr&quo ...
- 【Json】关于json解析时异常org.json.JSONException: A JSONObject text must begin with '{' at character 1 of {的解决方法
遇到这种异常有几种情况: 1.JSON格式有问题,检查一下格式. 2.格式没问题,仍然报错,这个是因为你的json文件头里带有编码字符(如UTF-8等),读取字符串时json串是正常的,但是解析就有异 ...
- Qt on Android: http下载与Json解析
百度提供有查询 ip 归属地的开放接口,当你在搜索框中输入一个 ip 地址进行搜索,就会打开由 ip138 提供的百度框应用,你能够在框内直接输入 ip 地址查询.我查看了页面请求,提取出查询 ip ...
随机推荐
- PHP——小尾巴之流程处理
说明:首先新建一个流程,把处理流程的节点人员添加进去,最后点确定提交至数据库 处理流程:不同用户登录进去处理自己的节点部分对其审核通过 新建两个流程: 第一个为借款流程:处理顺序为:李四发起=> ...
- 修复安卓的bug
一直不明白listview中的复用,为什么会出现,项目多了.点击同一行的按钮,操作的不是指定行的对象. 仔细研读了代码,突然明白了.因为复用了,导致了position改变了. 伪码 if(conver ...
- HTML5标准最终来了,看什么书学习最好??????
近期看了一本书<HTML5网页开发实例具体解释>,是大众点评的攻城狮写的,认为非常有收获.看样子眼下大多数的国内网页都支持HTML5了,全栈project师是不是必须得会HTML5? 有兴 ...
- VB.NET & 策略模式(下机用户类型选择)
上篇文章讲述了对于下机操作和基本数据设定的时间联系,今天主要就是应用"策略模式"来了解了解对于固定用户,以及暂时用户之间的选择,看学习设计模式的时候自己对于策略模式的理解,我们能够 ...
- 【转】web测试技术经典案例(基础、全面)
觉得有些内容还是挺实用的,就转了 1. 概述 随着web应用的增多,新的模式解决方案中以web为核心的应用也越来越多,很多公司各种应用的架构都以B/S及web应用为主,但是有关WEB测试方面的内容并没 ...
- HBase学习系列
转自:http://www.aboutyun.com/thread-8391-1-1.html 问题导读: 1.hbase是什么? 2.hbase原理是什么? 3.hbase使用中会遇到什么问题? 4 ...
- 31Mybatis_mybatis和spring整合-mapper代理开发
案例结构图:
- 第二百五十一节,Bootstrap项目实战--响应式轮播图
Bootstrap项目实战--响应式轮播图 学习要点: 1.响应式轮播图 本节课我们要在导航条的下方做一张轮播图,自动播放最新的重要动态. 一.响应式轮播图 响应式轮播图 第一步,设置轮播器区域car ...
- linux -- chcp
mysql在控制台中,插入数据到数据库的某个表中,插入的数据中有中文,结果一直显示错误Incorrect string...,不能插入成功 猜测是编码格式不一致.可通过chcp命令修改控制台编码格式 ...
- css -- hover伪类
CSS代码: .btn-setDefaultGateway{display: none;} .netDiv:hover span .btn-setDefaultGateway { display: i ...