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 ...
随机推荐
- 终端运行apk
启动一个活动 am start -n com.example.apptest/com.example.apptest.MainActivity 替换apk . udisk1/runRCApk.sh s ...
- java:常用的两种设计模式(单例模式和工厂模式)
一.单例模式:即一个类由始至终只有一个实例.有两种实现方式(1)定义一个类,它的构造方法是私有的,有一个私有的静态的该类的变量在初始化的时候就实例化,通过一个公有的静态的方法获取该对象.Java代码 ...
- dropload.js下拉加载更多
项目中有用到下拉加载更多的地方,去网上找了一个插件,地址:http://ons.me/526.html总体还是不错的,可能自己不是特别了解这个插件,做项目时,也是遇到了无数问题.项目中要用的是两个ta ...
- scala,spark练习题提高
1.求每家公司有哪些产品 val arr3 = List("Apache" -> "Spark", "Apache" -> &q ...
- org.apache.hadoop.hbase.DoNotRetryIOException: Class org.apache.phoenix.coprocessor.MetaDataEndpointImpl cannot be loaded Set hbase.table.sanity.checks to false at conf or table descriptor if you want
https://stackoverflow.com/questions/38495331/apache-phoenix-unable-to-connect-to-hbase 这个坑不该啊 首选配置hb ...
- SQL简明教程系列15 创建索引
CREATE INDEX用于在表中创建索引. 索引使数据库应用程序可以更快地查找数据. 注:更新一个包含索引的表比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新.因此,理想的做法是仅仅在常 ...
- ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...
- 【BZOJ】1699: [Usaco2007 Jan]Balanced Lineup排队(rmq/树状数组)
http://www.lydsy.com/JudgeOnline/problem.php?id=1699 我是用树状数组做的..rmq的st的话我就不敲了.. #include <cstdio& ...
- 让div也出现滑动框。
<div id="box" style="height: 300px; width: 200px; border:1px solid #CCC; overflow: ...
- PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
php屏蔽电话号码中间四位: Method 1: function hidtel($phone){ $IsWhat = preg_match('/(0[0-9]{2,3}[\-]?[2-9][0-9] ...