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 ...
随机推荐
- UVA - 10196:Check The Check
类型:简单模拟 大致题意:已知国际象棋行棋规则,给你一个局面,问是否将军?谁将谁的军?(保证不会同时将军) 思路:都以小写字母 测试 是否将 大写字母. 然后一个局面测两次(一次直接测,一次反转棋盘, ...
- Atcoder Grand Contest 024
A 略 B 略 C 略 D(构造分形) 题意: 给出一个由n个点的组成的树,你可以加一些点形成一个更大的树.对于新树中的两个点i和j,如果以i为根的树与以j为根的树是同构的那么i和j颜色可以相同.问最 ...
- MySql_ procedure
返回参数示例 下面是一个示例: delimiter //S drop procedure if EXISTS myzrz; CREATE PROCEDURE myzrz(in pin int,out ...
- DevExpress打印功能介绍 z
一.打印功能说明: 打印功能,我们有多种实现方式,可以根据需要自行选择,我简单的总结下两种方法. (1).使用微软.net框架自带的PrintDocument,这种方式是直接借助Graphics,自行 ...
- win10 nginx + django +flup 配置
1 安装 Nginx 官网下载,直接点exe启动即可 2 安装django pip install django 注意 新建立项目时 python *****/django-admin.py star ...
- react/redux组件库、模板、学习教程
开源的有蚂蚁金服的: 1.https://pro.ant.design/index-cn 2.https://pro.ant.design/docs/getting-started-cn 3.http ...
- lua——基础语法
-- test lua: for learning lua grammar -- line comment --[[ block comment ]]-- -- print hello world p ...
- Eclipse 修改字符集
Eclipse 修改字符集 默认情况下 Eclipse 字符集为 GBK,但现在很多项目采用的是 UTF-8,这是我们就需要设置我们的 Eclipse 开发环境字符集为 UTF-8, 设置步骤如下: ...
- [Node.js] 關於 console.log 的格式化輸出
Node.js 當中的 console.log,除了基本字串的輸出之外,還可以利用 %s.%d.%j 格式化的輸出,就讓我們來看些例子吧! 一.範例1 (字串輸出):console.js consol ...
- 读取配置文件(configparser,.ini文件)
使用configparser来读取配置信息config.ini 读取的信息(config.ini)如下: [baseconf]host=127.0.0.1port=3306user=rootpassw ...