转载自: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对泛型的序列化和反序列化方法汇总相关推荐

  1. 分享套接字数据包序列化与反序列化方法

    分享套接字数据包序列化与反序列化方法 " 简单说一下,本文不涉及Socket的连接.数据接收,只是对数据包(byte[])的序列化和反序列化方法的封装介绍. 本文目录 本文背景 一般操作 本 ...

  2. java get方法不序列化_java常用序列化与反序列化方法

    序列化工具类 序列化即将对象序列化为字节数组,反序列化就是将字节数组恢复成对象. 主要的目的是方便传输和存储. 序列化工具类: public class SerializeUtil { private ...

  3. java常用序列化与反序列化方法

    序列化工具类 序列化即将对象序列化为字节数组,反序列化就是将字节数组恢复成对象. 主要的目的是方便传输和存储. 序列化工具类: public class SerializeUtil {private ...

  4. Jackson 注解 -- 类型转换(序列化,反序列化)、私有字段

    如果输入输出 JSON 时需要类型转换,我们可以使用注解 @JsonDeserialize 和 @JsonSerialize package shangbo.jackson.demo17;import ...

  5. Jackson序列化和反序列化

    1,下载Jackson工具包(jackson-core-2.2.3.jar  jackson-annotations-2.2.3.jar  jackson-databind-2.2.3.jar ) j ...

  6. DotNet的JSON序列化与反序列化

    JSON(JavaScript Object Notation)JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.在现在的通信中,较多的采用JSON数据格式,JSON有 ...

  7. Java基础-序列化与反序列化

    序列化和反序列化在面试中也经常考查,下面就总结一下 Java 中的序列化和反序列化. 什么是序列化和反序列化? 序列化是将 Java 对象转换成与平台无关的二进制流,而反序列化则是将二进制流恢复成原来 ...

  8. XML的序列化和反序列化 详细介绍

    为什么要做序列化和反序列化? 一个回答: 我们都知道对象是不能在网络中直接传输的,不过还有补救的办法.XML(Extensible Markup Language)可扩展标记语言,本身就被设计用来存储 ...

  9. java对象的序列化和反序列化详细解释

    java对象的序列化和反序列化是什么意思 1.序列化是干啥用的? 序列化的原本意图是希望对一个Java对象作一下"变换",变成字节序列,这样一来方便持久化存储到磁盘,避免程序运行结 ...

最新文章

  1. Eclispse Che(2):启动Che服务,进入IDE界面
  2. 虚拟仪器软件LabView使用初步了解
  3. word中光标选择一列文字_Word中文字排版对齐很难?只因你没掌握这几招排版技巧!...
  4. 使用Jexus 容器化您的 Blazor 应用程序
  5. c#string倒数第二位插入字符_c#string倒数第二位插入字符_C#利用String类的IndexOf、LastIndexOf、...
  6. C++:VS2019遇到C1083 无法打开包括文件: “opencv2/opencv.hpp”: No such file or directory
  7. matlab向量相减代码,matlab转c++代码实现(主要包含C++ std::vector,std::pair学习,包含数组与常数相乘,数组相加减,将数组拉成一维向量等内容)...
  8. 搭建Harbor docker镜像仓库
  9. 关于结构体的浅拷贝和深拷贝
  10. Module-Zero之组织单元(OU)管理【新增】
  11. AcWing 837. 连通块中点的数量
  12. B站莫烦Python基础学习笔记
  13. 160个CrackMe破解思路合集
  14. 惠普打印机服务器状态未知,惠普打印机状态显示需要注意
  15. 当我们在谈论机器人的时候我们在谈论什么?
  16. 只要花3K 手把手教你制作炫酷的MR混合现实视频
  17. Mac wifi 卡死
  18. WFP 样式(复习用)
  19. qt 计算字符串宽度高度
  20. 整理GitHub近期热门开源后台管理系统

热门文章

  1. pycharm 同一个目录下导入py文件时,模块下方出现红色波浪线时如何解决
  2. 天翼云盘在MAC系统里卸载不了,怎么解决呢
  3. 对账与清分、清算、结算
  4. Sencha Touch
  5. Excel函数 - 多条件统计
  6. 一个域名价值怎么看 域名估值的标准是什么
  7. 解决IDM下载pornhub视频提示“服务器响应显示您没有权限下载此文件” 403Forbidden
  8. RabbitMQ的简单使用
  9. CentOS7部署nextcloud最新版本
  10. Android 7.1.2 更换原生输入法