解决Jackson反序列化map,set等复杂类型问题

工作中遇到了这个问题,我简单的用代码复现一下,就是一个map,value又为一个set,导致反序列化报错

@Test
  public void test10() throws Exception {
    //准备一下数据
    Map<String, Set<String>> map = new HashMap<>();
    map.put("aaa",new HashSet<String>(){{add("111");add("222");}});
    ObjectMapper om = new ObjectMapper();
    String str01 = om.writeValueAsString(map);
    //System.out.println(str01); // {"aaa":["111","222"]}
    // 正常反序列化,未报错
    Map<String, Set<String>> map01 = om.readValue(str01, Map.class);
    // 取值的时候就会报错了
    Set<String> aaa = map01.get("aaa");
  }

报错:

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Set

报错信息:无法将list转为set。

再拓展开来,其实当你的Map里面的对象如果是object类型的自定义类型,其实都会报错,无法被强转,那么我们就需要指定jackson反序列化为什么类型,而不是让它自主决定反序列化成什么类型,需要用到TypeReference,直接上代码。

@Test
public void test10() throws Exception {
  //准备一下数据
  Map<String, Set<String>> map = new HashMap<>();
  map.put("aaa",new HashSet<String>(){{add("111");add("222");}});
  ObjectMapper om = new ObjectMapper();
  String str01 = om.writeValueAsString(map);
  //System.out.println(str01); // {"aaa":["111","222"]}
  Map<String, Set<String>> m = om.readValue(str01, new TypeReference<HashMap<String, Set<String>>>() {});
  Set<String> aaa = m.get("aaa");
  System.out.println(aaa instanceof HashSet); // true
}

补充知识:Jackson 处理复杂类型(List,map)两种方法

方法一

String jsonString="[{'id':'1'},{'id':'2'}]";
ObjectMapper mapper = new ObjectMapper();
JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, Bean.class);
//如果是Map类型 mapper.getTypeFactory().constructParametricType(HashMap.class,String.class, Bean.class);
List<Bean> lst = (List<Bean>)mapper.readValue(jsonString, javaType);  

当转换完成时一定要用这个转换对象,如果不用这个对象是没有值的.如下,当我打印时这个projects对象才有值,否则projects无值 .

List<AlertProjectInfo> projects = mapper.readValue(subProject, mapper.getTypeFactory().constructCollectionType(List.class, AlertProjectInfo.class));
System.out.println(projects.size());

方法二

String jsonString="[{'id':'1'},{'id':'2'}]";
ObjectMapper mapper = new ObjectMapper();
List<Bean> beanList = mapper.readValue(jsonString, new TypeReference<List<Bean>>() {}); 

以上这篇解决Jackson反序列化map,set等复杂类型问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • jackson序列化和反序列化的应用实践指南

    源码地址:https://github.com/zhouweixin/serializable 1 相关概念 序列化: 把对象转换为字节序列的过程称为对象的序列化 反序列化: 把字节序列恢复为对象的过程称为对象的反序列化 2 序列化的作用 用于把内存中的对象状态保存到一个文件中或者数据库中 用于网络传送对象 用于远程调用传输对象 3 准备序列化对象 准备了两个类, 教师类和学生类, 其中一个学生只有一个教师 这里省略了构造方法和setter, getter方法 Teacher.java publ

  • 基于Spring Web Jackson对RequestBody反序列化失败的解决

    最近在用Spring Web做一些Restful API的实现试验,碰到了@RequestBody 的JSON无法被正常反序列化的问题.服务端的代码大致如下: @RequestMapping(value = "/aquas", method = RequestMethod.POST) public Aqua createAqua(@RequestBody Aqua aqua) { return aqua; } 研究后发现,由于Aqua这个实体类缺少了默认的无参构造函数(如果自行添加了有

  • JSON序列化Redis读取出错问题解决方案

    报错 org.springframework.web.util.NestedServletException: Request processing failed; nested exception is com.alibaba.fastjson.JSONException: syntax error, expect {, actual string, pos 1, fastjson-version 1.2.44 问题分析 在写入缓存的时候,hash结构,它的value值,在写入前使用JSON

  • Jackson序列化和反序列化忽略字段操作

    一.设置Jackson序列化时只包含不为空的字段 new ObjectMapper().setSerializationInclusion(Include.NON_NULL); 二.设置在反序列化时忽略在JSON字符串中存在,而在Java中不存在的属性 new ObjectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); 三.Jackson序列化时忽略字段的方式 1.方式一:FilterProvider a)在需

  • 一文带你彻底理解Java序列化和反序列化

    Java序列化是什么? Java序列化是指把Java对象转换为字节序列的过程,Java反序列化是指把字节序列恢复为Java对象的过程. 反序列化: 客户端重文件,或者网络中获取到文件以后,在内存中重构对象. 序列化: 对象序列化的最重要的作用是传递和保存对象的时候,保证对象的完整性和可传递性.方便字节可以在网络上传输以及保存在本地文件. 为什么需要序列化和反序列化 实现分布式 核心在于RMI,可以利用对象序列化运行远程主机上的服务,实现运行的时候,就像在本地上运行Java对象一样. 实现递归保存

  • 解决Jackson反序列化map,set等复杂类型问题

    工作中遇到了这个问题,我简单的用代码复现一下,就是一个map,value又为一个set,导致反序列化报错 @Test public void test10() throws Exception { //准备一下数据 Map<String, Set<String>> map = new HashMap<>(); map.put("aaa",new HashSet<String>(){{add("111");add(&qu

  • 使用Jackson反序列化遇到的问题及解决

    Jackson反序列化遇到的问题 最近在项目中需要使用Jackson把前台转来的字符转为对象,转换过程中发生了错误,报错如下 ​com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not construct instance of java.util.Date from String value '2018-09-14 15:12:08': not a valid representation (error: Failed

  • jackson反序列化时如何忽略不需要的字段

    目录 jackson反序列化忽略字段 解决办法很简单 jackson忽略指定属性 例子 jackson反序列化忽略字段 JSON字符串中含有我们并不需要的字段,那么当对应的实体类中不含有该字段时,会抛出一个异常,告诉你有些字段没有在实体类中找到. 解决办法很简单 在声明ObjectMapper之后,加上上述代码: objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); jackson忽略指

  • 解决Python3下map函数的显示问题

    map函数是Python里面比较重要的函数,设计灵感来自于函数式编程.Python官方文档中是这样解释map函数的: map(function, iterable, ...) Return an iterator that applies function to every item of iterable, yielding the results. If additional iterable arguments are passed, function must take that man

  • 解决mybatis用Map返回的字段全变大写的问题

    mybatis通常情况都是用javabean作为resultType的对象,但是有时也可以使用Map去接收. <select id="execute" parameterType="String" resultType="java.util.HashMap"> ${value} </select> 如果使用Map,返回来的字段名全是大写,处理方法 Select name as "name" from v

  • 使用Jackson实现Map与Bean互转方式

    Jackson Map与Bean互转 在使用 java 开发中,通常需要把 Map 转成 Bean,或把 Bean 转成 Map,这就用的工具类,在此推荐使用import com.fasterxml.jackson.databind.ObjectMapper;包下的ObjectMapper类,比 JsonObject 效率高 下面就列举了几种使用方法 1.pom.xml <dependency> <groupId>com.fasterxml.jackson.core</gro

  • Jackson 反序列化时实现大小写不敏感设置

    常用配置 ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(Feature.IGNORE_UNKNOWN,true); objectMapper.configure(Feature.WRITE_BIGDECIMAL_AS_PLAIN,true); objectMapper.configure(JsonParser.Feature.ALLOW_MISSING_VALUES,true); objectMapp

  • 解决Swagger2返回map复杂结构不能解析的问题

    今天有同事用swagger2开发时,有一方法返回Map<String,List<Object>>出现无法解析错误. Pom.xml引入的swagger版本如下: <!--swagger start--> <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-annotations</artifactId> <version>1.

  • Jackson反序列化@JsonFormat 不生效的解决方案

    今天在线上发现一个问题,在使用Jackson进行时间的反序列化时,配置的 @JsonFormat 没有生效 查看源码发现,Jackson在反序列化时间时,会判断json字段值类型,如下: 由于在我们服务里,前端传时间值到后端时采用了时间戳的方式,json值被判断为数字类型,所以Jackson在反序列化时直接简单粗暴的方式处理,将时间戳转换为Date类型: 为了能够按照正确的格式解析时间,抹去后面的时间点,精确到日,只好自定义一个时间解析器.自定义的时间解析器很好实现,网上已经有很多实例代码,只需

  • 解决Jackson解析嵌套类问题(MismatchedInputException)

    目录 Jackson解析嵌套类(MismatchedInputException) 具体报错如下 Jackson处理嵌套Json数据 数据 ------>打印每条数据 代码 输出结果 Jackson解析嵌套类(MismatchedInputException) 具体报错如下 问题描述:Jackson解析嵌套类问题  调用接口返回json格式的数据,使用Jackson解析参数转换成对象: @Data @JsonIgnoreProperties(ignoreUnknown = true) publi

随机推荐