Jackson对泛型的序列化和反序列化方法汇总
转载自:https://www.cnblogs.com/EasonJim/p/7919422.html
说明:Jackson对于简单泛型是可以正常操作的,但是如果对于太过于复杂的泛型类有时会不成功。目前还在找着更合适的Json库。不过这一点在dotnet原生方案JavaScriptSerializer可以完美解决这一些问题,无论泛型多复杂。
例子如下:
package com.jsoft.springboottest.springboottest1.controller;import java.io.IOException;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jsoft.springboottest.springboottest1.Pager;
import com.jsoft.springboottest.springboottest1.PagerAppoint;
import com.jsoft.springboottest.springboottest1.User;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;@RestController
public class TestController {private static final Logger logger = LoggerFactory.getLogger(TestController.class);@RequestMapping("/show")public String show() throws IOException {ObjectMapper mapper = new ObjectMapper();User user = new User();user.setId(1);Pager<User> pager = new Pager<User>();List<User> users = new ArrayList<User>();users.add(user);pager.setDatas(users);String json = mapper.writeValueAsString(pager);// 方式1Pager<User> userPager1 = mapper.readValue(json, new TypeReference<Pager<User>>() {});// 方式2Type[] types = new Type[1];types[0] = User.class;final ParameterizedTypeImpl type = ParameterizedTypeImpl.make(Pager.class, types, Pager.class.getDeclaringClass());TypeReference typeReference = new TypeReference<Pager>() {@Overridepublic Type getType() {return type;}};Pager<User> userPager2 = mapper.readValue(json, typeReference);// 方式3JavaType javaType = mapper.getTypeFactory().constructParametrizedType(Pager.class, Pager.class, User.class);Pager<User> userPager3 = mapper.readValue(json, javaType);// 方式4JavaType javaType1 = mapper.getTypeFactory().constructParametricType(Pager.class, User.class);Pager<User> userPager4 = mapper.readValue(json, javaType1);// 方式5,新建另一个指定具体泛型T的参数的类PagerAppoint userPager5 = mapper.readValue(json, PagerAppoint.class);// 数组泛型的序列化和反序列化String json1 = mapper.writeValueAsString(users);JavaType javaType2 = mapper.getTypeFactory().constructParametricType(List.class, User.class);List<User> users1 = mapper.readValue(json1, javaType2);// HashMapMap<String, User> map = new HashMap<String, User>(16);map.put("test", user);String json2 = mapper.writeValueAsString(map);// 1Map<String, User> users2 = mapper.readValue(json2, new TypeReference<Map<String, User>>() {});// 2JavaType javaType3 = mapper.getTypeFactory().constructParametricType(HashMap.class, String.class, User.class);Map<String, User> users3 = mapper.readValue(json2, javaType3);return "hello world";}
}
示例工程:https://github.com/easonjim/5_java_example/tree/master/springboottest/springboottest10
参考:
http://www.yiibai.com/jackson/jackson_data_binding_generics.html
http://blog.csdn.net/z69183787/article/details/46235905
http://bbs.csdn.net/topics/391823803
https://www.cnblogs.com/quanyongan/archive/2013/04/16/3024993.html
http://www.hankcs.com/program/json-to-map-java-demo-code.html
http://huangyunbin.iteye.com/blog/2352243
http://www.jianshu.com/p/ca03c2fe36e3
http://www.yiibai.com/jackson/jackson_data_binding_generics.html
http://bbs.csdn.net/topics/391823803
https://www.cnblogs.com/quanyongan/archive/2013/04/16/3024993.html
Jackson对泛型的序列化和反序列化方法汇总相关推荐
- 分享套接字数据包序列化与反序列化方法
分享套接字数据包序列化与反序列化方法 " 简单说一下,本文不涉及Socket的连接.数据接收,只是对数据包(byte[])的序列化和反序列化方法的封装介绍. 本文目录 本文背景 一般操作 本 ...
- java get方法不序列化_java常用序列化与反序列化方法
序列化工具类 序列化即将对象序列化为字节数组,反序列化就是将字节数组恢复成对象. 主要的目的是方便传输和存储. 序列化工具类: public class SerializeUtil { private ...
- java常用序列化与反序列化方法
序列化工具类 序列化即将对象序列化为字节数组,反序列化就是将字节数组恢复成对象. 主要的目的是方便传输和存储. 序列化工具类: public class SerializeUtil {private ...
- Jackson 注解 -- 类型转换(序列化,反序列化)、私有字段
如果输入输出 JSON 时需要类型转换,我们可以使用注解 @JsonDeserialize 和 @JsonSerialize package shangbo.jackson.demo17;import ...
- Jackson序列化和反序列化
1,下载Jackson工具包(jackson-core-2.2.3.jar jackson-annotations-2.2.3.jar jackson-databind-2.2.3.jar ) j ...
- DotNet的JSON序列化与反序列化
JSON(JavaScript Object Notation)JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.在现在的通信中,较多的采用JSON数据格式,JSON有 ...
- Java基础-序列化与反序列化
序列化和反序列化在面试中也经常考查,下面就总结一下 Java 中的序列化和反序列化. 什么是序列化和反序列化? 序列化是将 Java 对象转换成与平台无关的二进制流,而反序列化则是将二进制流恢复成原来 ...
- XML的序列化和反序列化 详细介绍
为什么要做序列化和反序列化? 一个回答: 我们都知道对象是不能在网络中直接传输的,不过还有补救的办法.XML(Extensible Markup Language)可扩展标记语言,本身就被设计用来存储 ...
- java对象的序列化和反序列化详细解释
java对象的序列化和反序列化是什么意思 1.序列化是干啥用的? 序列化的原本意图是希望对一个Java对象作一下"变换",变成字节序列,这样一来方便持久化存储到磁盘,避免程序运行结 ...
最新文章
- Eclispse Che(2):启动Che服务,进入IDE界面
- 虚拟仪器软件LabView使用初步了解
- word中光标选择一列文字_Word中文字排版对齐很难?只因你没掌握这几招排版技巧!...
- 使用Jexus 容器化您的 Blazor 应用程序
- c#string倒数第二位插入字符_c#string倒数第二位插入字符_C#利用String类的IndexOf、LastIndexOf、...
- C++:VS2019遇到C1083 无法打开包括文件: “opencv2/opencv.hpp”: No such file or directory
- matlab向量相减代码,matlab转c++代码实现(主要包含C++ std::vector,std::pair学习,包含数组与常数相乘,数组相加减,将数组拉成一维向量等内容)...
- 搭建Harbor docker镜像仓库
- 关于结构体的浅拷贝和深拷贝
- Module-Zero之组织单元(OU)管理【新增】
- AcWing 837. 连通块中点的数量
- B站莫烦Python基础学习笔记
- 160个CrackMe破解思路合集
- 惠普打印机服务器状态未知,惠普打印机状态显示需要注意
- 当我们在谈论机器人的时候我们在谈论什么?
- 只要花3K 手把手教你制作炫酷的MR混合现实视频
- Mac wifi 卡死
- WFP 样式(复习用)
- qt 计算字符串宽度高度
- 整理GitHub近期热门开源后台管理系统