Qt 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();
}
编写这样的代码,枯燥费时,但我目前没有更好的解决方案。
Qt JSON解析生成笔记的更多相关文章
- Qt JSON解析生成笔记(把JSON转成一个类对象)
对于这样一段json { "name": "布衣食", "gender": "Male", "age" ...
- QT json字符串生成和解析
1 QT json字符串生成和解析 1.1 QT Json解析流程 (1) 字符串转化为QJsonDocument QJsonParseError json_error; QJso ...
- ruby json解析&生成
JSON 通常用于与服务端交换数据. 在接收服务器数据时一般是字符串. 我们可以使用 JSON.parse() 方法将数据转换为 ruby 对象. 一. json字符串解析 require 'json ...
- QT使用QJson生成解析Json数据的方法
QT中使用json还是比较方便的,下面用例子直接说明 举例子之前首先推荐一个在线解析json格式的网站,具体格式用法如下图所示: 之后根据这个格式进行json数据解析. QT使用json需要包含的头文 ...
- 项目开发笔记-传单下发 名片替换 文件复制上传/html静态内容替换/json解析/html解析
//////////////////////////// 注意: 此博客是个人工作笔记 非独立demo////////////////////////////////// .............. ...
- c#实例化继承类,必须对被继承类的程序集做引用 .net core Redis分布式缓存客户端实现逻辑分析及示例demo 数据库笔记之索引和事务 centos 7下安装python 3.6笔记 你大波哥~ C#开源框架(转载) JSON C# Class Generator ---由json字符串生成C#实体类的工具
c#实例化继承类,必须对被继承类的程序集做引用 0x00 问题 类型“Model.NewModel”在未被引用的程序集中定义.必须添加对程序集“Model, Version=1.0.0.0, Cu ...
- Qt on Android: http下载与Json解析
百度提供有查询 ip 归属地的开放接口,当你在搜索框中输入一个 ip 地址进行搜索,就会打开由 ip138 提供的百度框应用,你能够在框内直接输入 ip 地址查询.我查看了页面请求,提取出查询 ip ...
- android Json 解析和生成
什么是json: JSON即JavaScript Object Natation的简称,它是一种轻量级的数据交换格式,非常适合服务器与JavaScript的交互.JSON易于人阅读和编写.同时也易于机 ...
- java中json数据生成和解析(复杂对象演示)
1.json简单介绍 1.1 json是最流行和广泛通用的数据传输格式,简称JavaScript Object Notation,最早在JavaScript中使用. 1.2 举个例子,下面是一个jso ...
随机推荐
- C++ 代码静态分析工具cppcheck【转】
转自:http://blog.csdn.net/chen19870707/article/details/42393217 权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] c ...
- Sublime Text 新文本编辑器(txt3)
http://www.sublimetext.com/
- HRBUST 2078:糖果(模拟,贪心)
题不难,但作为一道恶心到了我的题,我还是记录一下的好. 题意:n个人围一圈,要求:相邻两人,分数高的要比分数低的得到更多的糖果,若分数相同则必须得到相同数量的糖果.问满足要求的最少需要分配的糖果数.( ...
- Python Challenge 第六关
第六关只有一张图和一个 PayPal 的链接,右键源代码注释中写着 PayPal 是作者要赞助的,跟题目没关系,其他的提示只有注释中写的个 zip.试过下图片,改图片扩展名等等都失败了,最后乱试改了下 ...
- 本地安装Sass,Compass
使用本地的gem文件来安装Sass和Compass. 1.安装Ruby http://rubyinstaller.org/downloads/ 下载之后双击安装即可,在安装过程中可以选择“Add Ru ...
- AC日记——最优贸易 codevs 1173
题目描述 Description [问题描述]C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路 ...
- AC日记——总分 Score Inflation 洛谷 P2722
题目背景 学生在我们USACO的竞赛中的得分越多我们越高兴. 我们试着设计我们的竞赛以便人们能尽可能的多得分,这需要你的帮助 题目描述 我们可以从几个种类中选取竞赛的题目,这里的一个"种类& ...
- java parse 带英文单词的日期字符串(转化新浪微博api返回的时间)
String str = "Sun Sep 23 00:32:57 +0800 2012"; SimpleDateFormat dateFormat = new SimpleDat ...
- maven项目对于maven远程仓库没有资源的解决办法
下载资源到本地 方法一:dependency scope 是system 类型 <dependency> <groupId>edu.ucar</groupId> & ...
- Java并发编程实战 读书笔记(一)
最近在看多线程经典书籍Java并发变成实战,很多概念有疑惑,虽然工作中很少用到多线程,但觉得还是自己太弱了.加油.记一些随笔.下面简单介绍一下线程. 一 线程与进程 进程与线程的解释 个人觉 ...