杰克逊前

通过。开始使用Spring 5和Spring Boot 2学习的春天课程:

>>查看课程

1.概述

在此快速教程中,我们将分析没有吸气器的实体的编组杰克逊的解决方案JsonMappingException异常

如果你想深入挖掘和学习你还可以用杰克逊2做其他很酷的事情-去主要的Jackson教程

进一步阅读:

Jackson对象映射器的介绍

本文将讨论Jackson的中心objectapper类、基本序列化和反序列化以及对这两个进程的配置。

使用可选的Jackson

快速浏览一下如何在Jackson中使用可选选项。

春天杰森和杰克逊

本文主要介绍如何在Spring 4.1中使用新的JSON-P支持。

2.这个问题

默认情况下,Jackson 2将只处理公共的字段,或者有一个公共getter方法序列化所有字段为private或包为private的实体将会失败:

public class MyDtoNoAccessors {String stringValue;int intValue;布尔booleanValue;MyDtoNoAccessors() {super();} //没有getter}
@Test(expected = JsonMappingException.class) public void givenObjectHasNoAccessors_whenSerializing_thenException() throws JsonParseException, IOException {String dtoAsString = new objectapper()。writeValueAsString(新MyDtoNoAccessors ());为了(dtoAsString notNullValue ());}

完整的异常是:

jsonmappingexception:没有发现dto类的序列化器。MyDtoNoAccessors和没有发现创建BeanSerializer的属性(为了避免异常,禁用SerializationFeature.FAIL_ON_EMPTY_BEANS))

3.解决方案

显而易见的解决方案是为字段添加getter——如果实体在我们的控制之下的话。如果不是这样的话无法修改实体的来源-那么杰克逊给了我们一些选择。

3.1。全球自动检测领域与任何可见性

这个问题的第一个解决方案是全局配置objectmap检测所有字段,无论其可见度:

objectMapper.setVisibility (PropertyAccessor。场,Visibility.ANY);

这将允许检测私有和包私有字段如果没有getter,序列化就能正常工作:

@Test public void givenObjectHasNoAccessors_whenSerializingWithAllFieldsDetected_thenNoException() throws JsonParseException, IOException {objectapper objectapper = new objectapper ();objectMapper.setVisibility (PropertyAccessor。场,Visibility.ANY);string dtoasstring = ObjectMapper.WriteValueAstring(新的MyDtonoAccessors());为了(dtoAsString containsString (intValue "));为了(dtoAsString containsString (stringValue "));为了(dtoAsString containsString (booleanValue "));}

3.2。检测到类级别的所有字段

Jackson 2提供的另一个选项是-而不是全局配置-在类级别控制字段的可见性通过这一点@JsonAutoDetect注释:

@jsonautodetect(timentvisibility =可见性.Any)公共类MyDtonoAccessors {...}

有了这个注释,序列化现在应该能正确地处理这个特定的类:

@test public voidedobjecthasnoaccessorsbuthasvisiblefields_whenserializing_thennoexception()抛出jsonparseexception,ioException {objectMapper objectMapper = new objectMapper();string dtoasstring = ObjectMapper.WriteValueAstring(新的MyDtonoAccessors());为了(dtoAsString containsString (intValue "));为了(dtoAsString containsString (stringValue "));为了(dtoAsString containsString (booleanValue "));}

4.结论

本文说明了如何在Jackson中绕过默认的视野的全局配置自定义可见性objectmap或者在个别课程上。Jackson还提供了一些选项,来精确控制映射器如何查看具有特定可见性的getter、setter或字段,从而允许进一步的定制。

实现所有这些示例和代码片段可以在我的github项目-这是一个基于eclipse的项目,所以它应该很容易导入和运行。

杰克逊底部

通过。开始使用Spring 5和Spring Boot 2学习的春天课程:

>>查看课程
3.注释
最老的
最新
内联反馈
查看所有评论
评论在本文上关闭!