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和类转换

gson json和类转换_带有GSON和抽象类的JSON相关推荐

  1. python json模块详解_深入解析Python编程中JSON模块的使用

    JSON编码支持的基本数据类型为 None , bool , int , float 和 str , 以及包含这些类型数据的lists,tuples和dictionaries. 对于dictionar ...

  2. python json方法详解_详解python中的json的基本使用方法

    在Python中使用json的时候,主要也就是使用json模块,json是以一种良好的格式来进行数据的交互,从而在很多时候,可以使用json数据格式作为程序之间的接口. #!/usr/bin/env ...

  3. python和json转换_【Python】python和json数据相互转换,json读取和写入,repr和eval()使用...

    Gson将字符串转换成JsonObject和JsonArray 以下均利用Gson来处理: 1.将bean转换成Json字符串: public static String beanToJSONStri ...

  4. 将json绑定为对象_了解自定义对象创建:JSON绑定概述系列

    将json绑定为对象 让我们看一下JSON绑定如何处理自定义对象的创建. 本系列的下一篇文章将介绍如何使用适配器自定义JSON-B. JSON-B期望所有类都有一个公共的无参数构造函数 ,在反序列化过 ...

  5. 将json 填入表格_如何将Google表格用作JSON端点

    将json 填入表格 UPDATE: 5/13/2020 - New Share Dialog Box steps available below. 更新:5/13/2020-下面提供了`` 新共享' ...

  6. 数组转json去除首尾引号_诞生于JavaScript,json的前世今生

    诞生于JavaScript,json的前世今生 json含义 在开始之前,问个问题,什么是json? a:我猜它应该是某一门高深的技术(语重心长) b:json这个词为啥谷歌翻译?是啥新词语嘛?是不是 ...

  7. asp.net JSONHelper JSON帮助类

    /************************************************** * 版权所有: Mr_Sheng * 文 件 名: JSONHelper.cs * 文件描述: ...

  8. java对象转换为JSON日期格式转换处理

    JSON日期格式转换的时候,默认情况下JSON对date类型会转换成一个多属性对象,如: "createTime":{ "date":11, "day ...

  9. python中json与str转换和出现KeyError的解决方法

    python中json与str转换和出现KeyError的解决方法 json转str str转json KeyError的解决方法 json转str json格式的数据其实就是dict类型的数据,如图 ...

最新文章

  1. java基础学习,一些零散的笔记之内部类
  2. 使用 detours 框架 hook 函数
  3. 华北计算机研究所分房,请教公安部第一研究所这样分房合理吗??
  4. (一)边缘AI:口罩检测
  5. 数据库多表链接查询的方式
  6. 通信子网和资源子网的区别
  7. 【读书笔记】《可复制的领导力》——人人都能学会领导力
  8. 华为交换机 查ip冲突_华为交换机发现邻居操作,查看端口和ip
  9. 软工网络15团队作业4——Alpha阶段敏捷冲刺之Scrum 冲刺博客(Day7)
  10. C语言数字图像处理---ZPHOTOENGINE算法库使用
  11. Kubernetes 中进行 PVC 的扩容
  12. 想起某个人,想到某些事
  13. Arduino 点灯实验
  14. 9.10教师节 Best wishes to teachers
  15. javac.exe 、 java.exe、 javaw.exe 、 javaws.exe有什么区别?
  16. 关联规则—频繁项集Apriori算法
  17. 配色表和配色网站:获取好看的配色
  18. ORA-00937:不是单组分组函数 ORA-22818:这里不允许出现子查询表达式
  19. PB 水凝胶基普鲁士蓝纳米复合物|碳纳米管-离子液体/聚苯胺-普鲁士蓝-普鲁士蓝氧化酶复合物|碳纳米管/普鲁士蓝(MWCNTs/PB)纳米复合物
  20. 苹果电脑macos Ventura 13.0(22A380)dmg原版引导版镜像下载

热门文章

  1. 如何设计一个安全的登录流程
  2. 到底什么是分布式系统
  3. 算法一之简单选择排序
  4. 刘奕佳: 我的职校新生活 | 班级日常分享
  5. js引擎执行代码的基本流程
  6. html画等边三角形,前台面试:使用CSS画一个等边三角形
  7. c语言程序设计实践教程张卫国,C语言程序设计实践教程
  8. dd命令打包多个文件_linux的tar命令详情;linux多个文件压缩打包到一个压缩文件...
  9. spring(13)缓存数据
  10. JavaBean 持久化