Jackson—— 转 List 和 Map 集合泛型 为Json 字符串 或 反转化

0、最近有遇到,Jackson 在如何 将 json 字符串 转化为 List 泛型的对象,刚开始的时候由于自己不太了解 Jackson 反序列化的一些方法,导致,反序列的时候总是不成功,后面经同事指导和看了一些官网文档,才发现正确的转化用法,于是,就将官网推荐的一个教程,翻译成这篇博客,以便参考。还有如果遇到 Mybatis-plus 在序列化两个 List 集合对象到数据库的时候,需要加上 autoResultMap=true ,不然会找不到对应的序列化 typeHandle参考官网说明.

以下为翻译内容:

1、概述

本教程将展示如何使用Jackson 2将JSON数组反序列化为Java数组或集合。

如果您想更深入地学习其他有趣的事情,可以使用Jackson 2进行操作 -转到Jackson的主要教程

2、反序列化数组

Jackson 可以轻松地反序列化为 Java Array:

@Test
public void givenJsonArray_whenDeserializingAsArray_thenCorrect() 
  throws JsonParseException, JsonMappingException, IOException {
  
    ObjectMapper mapper = new ObjectMapper();
    List<MyDto> listOfDtos = Lists.newArrayList(
      new MyDto("a", 1, true), new MyDto("bc", 3, false));
    String jsonArray = mapper.writeValueAsString(listOfDtos);
  
    // [{"stringValue":"a","intValue":1,"booleanValue":true},
    // {"stringValue":"bc","intValue":3,"booleanValue":false}]
 
    MyDto[] asArray = mapper.readValue(jsonArray, MyDto[].class);
    assertThat(asArray[0], instanceOf(MyDto.class));
}

3、反序列化集合

将相同的JSON数组读入Java集合要困难一些–默认情况下,Jackson将无法获取完整的泛型类型信息,而是创建一个Linked HashMap实例的集合:

@Test
public void givenJsonArray_whenDeserializingAsListWithNoTypeInfo_thenNotCorrect() 
  throws JsonParseException, JsonMappingException, IOException {
  
    ObjectMapper mapper = new ObjectMapper();
 
    List<MyDto> listOfDtos = Lists.newArrayList(
      new MyDto("a", 1, true), new MyDto("bc", 3, false));
    String jsonArray = mapper.writeValueAsString(listOfDtos);
 
    List<MyDto> asList = mapper.readValue(jsonArray, List.class);
    assertThat((Object) asList.get(0), instanceOf(LinkedHashMap.class));
}

有两种方法可以帮助Jackson 理解正确的类型信息 – 为此,我们可以使用库提供的TypeReference:

@Test
public void givenJsonArray_whenDeserializingAsListWithTypeReferenceHelp_thenCorrect() 
  throws JsonParseException, JsonMappingException, IOException {
  
    ObjectMapper mapper = new ObjectMapper();
 
    List<MyDto> listOfDtos = Lists.newArrayList(
      new MyDto("a", 1, true), new MyDto("bc", 3, false));
    String jsonArray = mapper.writeValueAsString(listOfDtos);
 
    List<MyDto> asList = mapper.readValue(
      jsonArray, new TypeReference<List<MyDto>>() { });
    assertThat(asList.get(0), instanceOf(MyDto.class));
}

或者,我们可以使用接受JavaType的重载readValue方法:

@Test
publi void givenJsonArray_whenDeserializingAsListWithJavaTypeHelp_thenCorrect() 
  throws JsonParseException, JsonMappingException, IOException {
    ObjectMapper mapper = new ObjectMapper();
 
    List<MyDto> listOfDtos = Lists.newArrayList(
      new MyDto("a", 1, true), new MyDto("bc", 3, false));
    String jsonArray = mapper.writeValueAsString(listOfDtos);
 
    CollectionType javaType = mapper.getTypeFactory()
      .constructCollectionType(List.class, MyDto.class);
    List<MyDto> asList = mapper.readValue(jsonArray, javaType);
  
    assertThat(asList.get(0), instanceOf(MyDto.class));
}

最后一点要注意的是MyDto类需要具有no-args默认构造函数–如果没有,则Jackson将无法实例化它

com.fasterxml.jackson.databind.JsonMappingException: 
No suitable constructor found for type [simple type, class org.baeldung.jackson.ignore.MyDto]: 
can not instantiate from JSON object (need to add/enable type information?)

4、结论

将 JSON 数组映射到 Java 集合是 Jackson 常用的更常见的任务之一,这些解决方案对于获得正确的类型安全的映射至关重要

所有这些示例和代码段的实现都可以在我们的 GitHub 项目中找到 –这是一个基于 Maven 的项目,因此应该很容易直接导入和运行。

原文

  1. https://www.baeldung.com/jackson-collection-array
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值