gson json和类转换_带有GSON和抽象类的JSON

gson json和类转换

经过多年使用org.json库在Java中支持JSON数据交换格式后,我已切换到Google Gson 。 org.json是一个较低层的库,因此您必须创建JSONObject,JSONArray,JSONString等…并执行其他低层工作。 Gson简化了这项工作。 它提供了简单的toJson()和fromJson()方法,可将任意Java对象转换为JSON,反之亦然,支持Java泛型,允许对对象进行自定义表示,生成紧凑且可读性强的JSON输出,并具有许多其他优点。 我越来越喜欢它。 使用很简单。 假设我们有一个叫做Circle的类。
public class Circle {private int radius = 10;private String backgroundColor = "#FF0000";private String borderColor = "#000000";private double scaleFactor = 0.5;...// getter / setter
}

序列化(Java对象–> JSON)可以如下进行:

Circle circle = new Circle();
Gson gson = new Gson();
String json = gson.toJson(circle); 
==> json is
{"radius": 10,"backgroundColor": "#FF0000","borderColor": "#000000","scaleFactor": 0.5,...
}

反序列化(JSON –> Java对象)只是一行代码:

Circle circle2 = gson.fromJson(json, Circle.class);  
==> circle2 is the same as the circle above

一切都像魅力。 我只遇到抽象类一个问题。 假设,我们有一个抽象类AbstractElement和许多其他类来扩展这一类

public abstract class AbstractElement {private String uuid;// getter / setter
}public class Circle extends AbstractElement {...
}public class Rectangle extends AbstractElement {...
}public class Ellipse extends AbstractElement {...
}

现在假设,我们将所有具体类存储在使用AbstractElement参数化的列表或映射中

public class Whiteboard
{private Map<String, AbstractElement> elements = new LinkedHashMap<String, AbstractElement>();...
}

问题是在反序列化过程中未公开具体类。 在Whiteboard的JSON表示中未知。 如何从JSON表示形式实例化正确的Java类并将其放入Map <String,AbstractElement>元素中? 我在文档中找不到任何解决该问题的方法。 显然,我们需要在有关具体类的JSON表示中存储元信息。 这是肯定的。 Gson允许您注册自己的自定义序列化器和反序列化器。 这是Gson的强大功能。 有时默认表示不是您想要的。 例如在处理第三方库类时,通常就是这种情况。 有足够的示例说明如何编写自定义序列化器/反序列化器。 我将创建一个实现两个接口JsonSerializer,JsonDeserializer的适配器类,并将其注册为我的抽象类AbstractElement。

GsonBuilder gsonBilder = new GsonBuilder();
gsonBilder.registerTypeAdapter(AbstractElement.class, new AbstractElementAdapter());
Gson gson = gsonBilder.create();

这是AbstractElementAdapter:

package com.googlecode.whiteboard.json;import com.google.gson.*;
import com.googlecode.whiteboard.model.base.AbstractElement;
import java.lang.reflect.Type;public class AbstractElementAdapter implements JsonSerializer<AbstractElement>, JsonDeserializer<AbstractElement> {@Overridepublic JsonElement serialize(AbstractElement src, Type typeOfSrc, JsonSerializationContext context) {JsonObject result = new JsonObject();result.add("type", new JsonPrimitive(src.getClass().getSimpleName()));result.add("properties", context.serialize(src, src.getClass()));return result;}@Overridepublic AbstractElement deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)throws JsonParseException {JsonObject jsonObject = json.getAsJsonObject();String type = jsonObject.get("type").getAsString();JsonElement element = jsonObject.get("properties");try {return context.deserialize(element, Class.forName("com.googlecode.whiteboard.model." + type));} catch (ClassNotFoundException cnfe) {throw new JsonParseException("Unknown element type: " + type, cnfe);}}
}

我添加了两个JSON属性-一个是“类型”,另一个是“属性”。 第一个属性保存AbstractElement的具体实现类(简单名称),第二个属性保存序列化对象本身。 JSON看起来像

{"type": "Circle","properties": {"radius": 10,"backgroundColor": "#FF0000","borderColor": "#000000","scaleFactor": 0.5,...}
}

在反序列化过程中,我们受益于“类型”属性。 现在可以通过Class.forName(“ com.googlecode.whiteboard.model。” + type)实例化具体类,其中“ com.googlecode.whiteboard.model”。 + type是完全限定的类名。 以下通话

public <T> T deserialize(JsonElement json, Type typeOfT) throws JsonParseException

JsonDeserializationContext中的from会在指定对象上调用默认反序列化并完成作业。

参考: 带有GSON的JSON和来自JCG合作伙伴 Oleg Varaksin的抽象类 , 在软件开发博客上。


翻译自: https://www.javacodegeeks.com/2012/04/json-with-gson-and-abstract-classes.html

gson json和类转换

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355878.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自考18年4月计算机应用基础,2019年自学考试计算机应用基础试题(18)

2019年4月自考报名已经拉开序幕&#xff0c;同学们可以开始准备自考复习&#xff0c;下面是2019年自学考试计算机应用基础试题(18)&#xff0c;了解更多自学考试资讯请锁定自学考试网&#xff0c;更有海量模拟试题&#xff0c;精品复习资料等你来下载!1.Windows 中删除文件夹的…

git中文件的三种状态

用xcode的时候&#xff0c;左侧栏文件的邮右边时不时会看到M&#xff0c;A这一类的字母。当然&#xff0c;这些以后再写上。先说一下git里文件的三种状态 已提交&#xff08;committed&#xff09; 已经提交的本地仓库&#xff08;repository&#xff09;&#xff0c;需要手动…

创建一个带参数的formgoup_gin框架如何获取带文件的formData请求?

**前端代码如下**function upFile() {var formData new FormDatavar file document.getElementById("upload").files[0]var text document.getElementById("text").valueformData.append("upload",file)formData.append("text",tex…

如何从URL查询字符串获得/附加视图参数(示例)?

让我们剖析几个简单的用例&#xff0c;并查看视图参数的工作原理&#xff08;视图参数名称不是强制性的&#xff0c;以匹配通过URL查询字符串传递的请求参数&#xff0c;但在本文中&#xff0c;我们将重点讨论这种情况&#xff09;&#xff1a; 情况1 在index.xhtml页面中&…

桌面怎么设置 计算机 网络,Win10 10130桌面电脑网络图标怎么设置?

越来越多朋友的计算机安装Windows10系统&#xff0c;现在Windows10系统已经升级到10130版&#xff0c;我的计算机升级到了10130版。安装Windows10的10130版系统后&#xff0c;桌面只有回收站和软媒的图标&#xff0c;如何把电脑、网络、用户的文件、控制面板等图标设置到桌面上…

swift 打开第三方应用_iOS卡通人物帧动画入门9(大结局):番外篇-扩展第三方类

扩展第三方类细心的朋友可能会发现&#xff0c;我们前面计算主角的大小用的总是同一方向第一帧纹理的大小&#xff0c;如果纹理大小有出入的话&#xff0c;会产生较大的偏差&#xff0c;最好的方法是取当前动画帧纹理的大小。不过这有些难度&#xff0c;所以我们退之求其次&…

awk说明书(转)

ref&#xff1a;http://blog.chinaunix.net/uid-429659-id-122573.html awk使用手册 作者&#xff1a;awk使用手册什么是awk? 你可能对UNIX比较熟悉&#xff0c;但你可能对awk很陌生&#xff0c;这一点也不奇怪&#xff0c;的确&#xff0c;与其优秀的功能相比&#xff0c;awk…

jpa jdbc jndi_没有J2EE容器的JNDI和JPA

jpa jdbc jndi我们希望通过尽可能简单的设置来测试一些JPA代码。 计划仅使用Java和Maven&#xff0c;不使用应用程序服务器或其他J2EE容器。 我们的JPA配置需要两件事才能成功运行&#xff1a; 数据库来存储数据&#xff0c; JNDI访问数据库。 这篇文章分为两个部分。 第一部…

本科计算机应用水平,湖南工程学院全日制非计算机专业本科生参加湖南省计算机应用水平等级考试的规定...

根据省教育厅《关于印发湖南省普通高等学校非计算机专业学生计算机应用水平等级考试大纲的通知》(湘教发〔2012〕58号)精神&#xff0c;经研究&#xff0c;现对我校全日制非计算机专业本科生参加计算机等级考试有关事项作如下规定&#xff1a;1&#xff0e;凡我校全日制非计算机…

Linux umask限制导致php的mkdir 0777无效

原因:mkdir权限受当前linux umask限制 解决方法: 1 $oldmask umask(0); 2 mkdir("test", 0777); 3 umask($oldmask); 参考SO:http://stackoverflow.com/a/3997671/4009148转载于:https://www.cnblogs.com/gy1010/p/6674243.html

cstringw转lpctstr_新手必看:CString 和 LPCTSTR等之间的转换大全 | 求索阁

CString 和 LPCTSTR 可以说通用。 原因在于CString定义的自动类型转换&#xff0c;没什么奇特的&#xff0c;最简单的C操作符重载而已。常量字符串ansi和unicode的区分是由宏_T来决定的。但是用_T( "abcd ")时&#xff0c; 字符串 "abcd "就会根…

vue如何过滤html标签,去除富文本中的html标签及vue、react、微信小顺序中的过滤器...

在猎取富文本后&#xff0c;又只需显现部分内容&#xff0c;须要去除富文本标签&#xff0c;然后再截取个中一部分内容&#xff1b;然后就是过滤器&#xff0c;在微信小顺序中运用照样挺屡次的&#xff0c;在vue及react中也遇到过1.富文本去除html标签去除html标签及 空格let r…

在基于简单Vertx Rest的应用程序上为REST资源设置基本响应HTTP标头

我是Vert.x的新手&#xff0c;但是作为Java开发人员&#xff08;非常努力&#xff09;&#xff0c;与NodeJS或其他任何基于Reactor的框架/库相比&#xff0c;我觉得它更加有趣并且很有前途。 因此&#xff0c;我正在使用Vert.x实现一个非常简单的Restful API。 今天的问题是我…

OAuth2认证有一定的了解

转到分享界面后&#xff0c;进行OAuth2认证&#xff1a; 以新浪为例&#xff1a; 第一步、WebView加载界面&#xff0c;传递参数 使用WebView加载登陆网页&#xff0c;通过Get方法传递三个参数&#xff1a;应用的appkey、回调地址和展示方式display(如手机设备为mobile)&#x…

声速的测量的实验原理和应用_CEMS烟气在线分析仪测量原理计经典应用

烟气连续在线监测系统运用抽取冷凝采样、后散射烟尘浓度测量、皮托管烟气流速测量及计算机网络通讯技术&#xff0c;实现了固定污染源污染物排放浓度和排放总量的在线连续监测。同时又针对国内煤种较杂、煤质变化大、污染物排放浓度高、烟气湿度大的状况从技术上进行了改进。并…

怎么用计算机算弧度制,怎么设置计算器 把度数转化为弧度

计算器默认角度制(D)。此时&#xff0c;按下mode&#xff0c;mode&#xff0c;2(Rad)&#xff0c;可将计算器调整为弧度制。输入要转化的角度(如30)&#xff0c;按下shift&#xff0c;ans(DRG三角)&#xff0c;1(D)&#xff0c;画面将显示30度&#xff0c;按下等号&#xff0c;…

Python 类方法、实例方法、静态方法

实例方法&#xff1a;类中第一个参数为self的方法。 类方法&#xff1a;类中第一个参数为类&#xff0c;约定写为cls&#xff0c;并被classmethod修饰的方法。 静态方法&#xff1a;类中被staticmethod修饰的方法。 类变量&#xff1a;定义在类的定义之后&#xff0c;如&#x…

python 方程组 整数解_用Python语言求解线性整数方程组

我在寻找一种用Python求解线性方程组的方法。特别是&#xff0c;我在寻找大于所有零的最小整数向量&#xff0c;并解出给定的方程。例如&#xff0c;我有以下等式&#xff1a;想解决。在在这种情况下&#xff0c;求解该方程的最小整数向量为。在但是&#xff0c;如何自动确定此…

计算机软件水平考试调整,全国计算机等级考试调整方案

考生们注意&#xff1a;在新的历史时期&#xff0c;全国计算机等级考试将在保持自身特色&#xff0c;稳定发展的基础上进一步推进考试改革&#xff0c;从2018年3月起&#xff0c;教育部考试中心将实施2018年考试大纲&#xff0c;并按新体系开考各个考试级别&#xff0c;希望能帮…

javaserver_集成Spring和JavaServer Faces:改进的模板

javaserver随着2.0版的发布&#xff0c;Facelet模板成为JSF规范的核心部分。 使用<ui&#xff1a;composition>和<ui&#xff1a;decorate>标记&#xff0c;可以轻松构建复杂的页面&#xff0c;同时仍保持标记的整洁。 模板在创建HTML表单时特别有用&#xff0c;但…