JSON 转含有泛型属性的对象
在将 json 字符串转为对象时,如果对象含有泛型,在进行转换时需要指明泛型类型。
1. 对象只含有一个泛型属性时
1.1 代码
/**
* @Describe:
* @Author: chenfan
* @Date: 2019/5/9 19:15
*/ @Data
/**
* 含有泛型属性的对象
*/
class OneGeneric<E>{
E e;
String ss;
} @Data
/**
* 泛型对象
*/
class KeyMessage{
String kk;
} public class JsonTest { public static void main(String[] args) { // {"e": {"kk":"qwe"},"ss": "ssValue"}
String data = "{\"e\": {\"kk\":\"qwe\"},\"ss\": \"ssValue\"}";
Gson gson = new Gson();
// OneGeneric : 外层对象类型 KeyMessage :嵌套的泛型类型
OneGeneric one = gson.fromJson(data, new TypeToken<OneGeneric<KeyMessage>>() {}.getType());
System.out.println(one);
} }
1.2 运行结果
正确转换如下:

1.3 泛型属性为集合类型时
此时和只有一个泛型对象时处理方式一样
public class JsonTest {
public static void main(String[] args) {
// {"ss": "ssValue","list":[{"dd":"dd1"},{"dd":"dd2"}]}
String data = "{\"ss\": \"ssValue\",\"list\":[{\"dd\":\"dd1\"},{\"dd\":\"dd2\"}]}";
Gson gson = new Gson();
OneGeneric grandMessage = gson.fromJson(data, new TypeToken<OneGeneric<Generic>>() {}.getType());
System.out.println(grandMessage);
}
}
/**
* 含有泛型属性的对象
*/
@Data
class OneGeneric<E>{
List<E> list;
String ss;
}
@Data
class Generic{
String dd;
}

2. 对象只含有多个泛型属性时
2.1 代码
/**
* @Describe:
* @Author: chenfan
* @Date: 2019/5/9 19:15
*/ @Data
/**
* 含有多个泛型属性的对象
*/
class GrandMessage<K,V>{ K key;
V value;
} /**
* 泛型对象
*/
@Data
class KeyMessage{
String kk;
} /**
* 泛型对象
*/
@Data
class ValueMessage{
String vv;
} /**
* 测试类
*/
public class JsonTest { public static void main(String[] args) {
// {"key": {"kk":"qwe"},"value": {"vv":"asd"}}
String data = "{\"key\": {\"kk\":\"qwe\"},\"value\": {\"vv\":\"asd\"}}";
Gson gson = new Gson();
GrandMessage grandMessage = gson.fromJson(data, new TypeToken<GrandMessage<KeyMessage,ValueMessage>>() {}.getType());
System.out.println(grandMessage);
}
}
2.2 运行结果

2.3 泛型的顺序问题
在进行对象转换时, TypeToken<GrandMessage<KeyMessage,ValueMessage>> 中的泛型类型顺序必须按照 GrandMessage<K,V> 中声明的顺序,否则会对象属性全部为null
3. 泛型类型嵌套
3.1 代码
@Data
class GrandMessage<K>{ K k;
String msg;
}
@Data
class OneGeneric<E>{
E e;
String one;
} @Data
class Generic{
String dd;
} /**
* 测试类
*/
public class JsonTest { public static void main(String[] args) {
// {"msg":"lili","k":{"one":"111","e":{"dd":"dddd"}}}
String data = "{\"msg\":\"lili\",\"k\":{\"one\":\"111\",\"e\":{\"dd\":\"dddd\"}}}";
Gson gson = new Gson();
// 转换时的泛型顺序一定要严格按照对象的嵌套顺序
GrandMessage grandMessage = gson.fromJson(data, new TypeToken<GrandMessage<OneGeneric<Generic>>>() {}.getType());
System.out.println(grandMessage);
}
}
3.2 运行结果

4. 自定义转换逻辑
JSON转对象时,如果对象某个属性不确定(比如对象定义为Object,实际为 int 类型),需要自定义转换逻辑
显示指定 OpSessionControlMessage 的 messageId 为 int 类型:
private static Gson gson2 = new GsonBuilder()
.registerTypeAdapter(
new TypeToken<OpSessionControlMessage>(){}.getType(),
new JsonDeserializer<OpSessionControlMessage>() {
@Override
public OpSessionControlMessage deserialize(
JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException { OpSessionControlMessage message = new OpSessionControlMessage();
JsonObject jsonObject = json.getAsJsonObject();
Set<Map.Entry<String, JsonElement>> entrySet = jsonObject.entrySet();
for (Map.Entry<String, JsonElement> entry : entrySet) {
Object ot = entry.getValue();
if(entry.getKey().equals("messageId")){
message.setOpType(((JsonPrimitive) ot).getAsInt());
}
}
return message;
}
}).create();
JSON 转含有泛型属性的对象的更多相关文章
- 含有Date属性的对象转化为Json
含有Date类型属性的对象,转化为Json,Date属性并不是时间戳格式. 解决方法: 使用Jackson的注解@JsonFormat,添加到对象属性上方即可. 我们的北京时间会相差8个小时,因为我们 ...
- Json.net对于导航属性的处理(解决对象循环引用)
对于两张表A.B多对多的关系中,A的导航属性中有B,B的导航属性中有A,这样Json.net对A或者B对象序列化时会形成死循环 所以对于导航属性要加标签 首先在A.B实体类工程(Model)中引用Js ...
- json-lib反序列化抽象属性及对象
使用json默认反序列化接口反序列化对象时,对象的类型必须的确定的,比如不能是抽象类型,否则会报无法实例化对象的异常 如有下列类定义: public abstract class AbstracObj ...
- Json Serialize 忽略特定属性
Json Serialize 忽略特定属性 Json Serialize SerializeFilter 忽略特定属性 key words:Json Serialize jackson fastjso ...
- 处理 JSON null 和空数组及对象
描述了对 JSON 数据中使用的 null 和空数组及对象的处理. JSON 数据具有 null 和空数组及对象的概念.此部分说明其中每个概念如何映射到 null 和未设置的数据对象概念. Null ...
- (74)Wangdao.com第十三天_Object 对象_属性描述对象
Object 对象 JavaScript 原生提供 Object 对象 JavaScript 的所有其他对象都继承自 Object 对象,即那些对象都是Object的实例 Object 对象的原生方 ...
- 不规范的json文档 转化成 java 对象的处理
最近练习爬取数据,遇到了json文档中属性名称没有用双引号的情况,内容如下: 标准的json文档,属性名称都是带双引号的 最后写了个方法,替换属性名字 为 两头追加双引号的属性名字, 特别要注意,防止 ...
- spring mvc接收ajax提交的JSON数据,并反序列化为对象
需求:spring mvc接收ajax提交的JSON数据,并反序列化为对象,代码如下: 前台JS代码: //属性要与带转化的对象属性对应 var param={name:'语文',price:16}; ...
- net.sf.json和 com.fasterxml.jackson中对象转json的区别
近期做项目的时候,发现使用net.sf.json包中的JSONObject或JSONArray将对象转为json数据结构存在一个坑.当对String类型的属性赋值为null情况下,转为json结构为& ...
随机推荐
- 自定义事件 Event 、CustomEvent的使用
通过Event和dispathEvents触发自定义事件 <span id="btn">获取</span> <script> var event ...
- A query was run and no Result Maps were found for...原来是mapper.xml文件出了问题,是使用MyBatis最常见的一种错误
今天遇到一个问题,原来是mapper.xml文件出了问题,是使用MyBatis最常见的一种错误 报错的结果是这样的: A query was run and no Result Maps were f ...
- Linux系统的grub和BIOS加密
启动流程: BIOS ——> MBR(主引导记录,找到系统在哪个分区) ——> boot loader(grub) ——>kernel(内核)——>进入启动级别init 硬盘的 ...
- 使用VMware Workstation15安装RHEL7.5以及相关设置(RHEL7及其以上版本均适用)
预备信息 VMware Workstation 是VMware公司发布的一款桌面虚拟计算软件,此软件提供虚拟机功能,使计算机可以同时运行多个操作系统. RHEL7.5(Red Hat Enterpri ...
- kotlin字符串和数字之间的转换和人机交互
继续基础学习~ 字符串和数字之间的转换 那如何转换呢,其实很简单: 编译木有报错,但是运行: 所以这里了解下. 人机交互 看这标题貌似高端的,其实也就是程序可以接受键盘的输入啦,下面开始: 首先提示用 ...
- PHP程序员要掌握的技能
1. Composer 第一点就要提 Composer ,自从 Composer 出现后,PHP 的依赖管理可以变得非常简单.程序内依赖一些类库和框架,直接使用 Composer 引入即可,通过使用 ...
- Django 中 cookie的使用
Cookie是浏览器在客户端留下的一段记录,这段记录可以保留在内存或者硬盘上.因为Http请求是无状态的,通过读取cookie的记录,服务器或者客户端可以维持会话中的状态.比如一个常见的应用场景就是登 ...
- QT容器类
QList<T> 是一个指针数组,可以使用下标 append(), prepend(), insert() QList<QString> list; list<<& ...
- laravel开发扩展记录
whoops 错误提示扩展 whoops 是一个非常优秀的 PHP Debug 扩展,它能够使你在开发中快速定位出错的位置.laravel默认安装.区域 1 -- 是错误异常的简介区域 2 -- 是错 ...
- es6 模块编译 *** is not function
今天学习vuejs,里面用到了es6的写法,遇到了一个很怪的问题,不知道有人遇到么. 安装的模块引用:import Vue from 'vue';(注意,Vue处没有{},如果加上这个就报错Uncau ...