杰克逊顶部

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

>>查看课程

1.概述

本教程将显示如何将对象序列化为JSON时忽略某些字段使用杰克逊2.x.

当杰克逊默认值不够时,这非常有用,并且我们需要正确地控制序列化到JSON的内容 - 并且有几种方法可以忽略属性。

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

进一步阅读:

jackson objectmapper介绍

本文讨论了杰克逊的中央象限展出者类,基本的序列化和反序列化以及配置两个进程。

杰克逊流媒体API.

快速概述Jackson用于处理JSON的流API,包括示例

@JsonFormat指南杰克逊

杰克逊@JSonFormat注释的一个快速实用的指南。

2.忽略类级别的字段

我们可以忽略类级别的特定字段@jsonignoreproperties.注释并按名称指定字段

@jsonignoreproperties(value = {“Intvalue”})公共类MyDto {私有字符串StringValue;私人INT INTVALUE;私人布尔booleanValue;public MyDto() {super();} //标准安置者和吸气器未显示}

我们现在可以测试,在对象写入JSON之后,该字段确实不是输出的一部分:

@test public void givefieldisignoredbyname_whendtoisserialized_thencorrect()抛出jsonparseexception,ioException {objectMapper映射器= new objectMapper();mydto dtooobject = new mydto();String dtoAsString = mapper.writeValueAsString(dtoObject);assertthat(dtoasstring,not(包含(“Intvalue”))));}

3.忽略字段级别的字段

我们还可以直接通过忽略一个字段@jsonignore.直接在字段上标注

public class MyDto {private String stringValue;@JsonIgnore private int intValue;私人布尔booleanValue;public MyDto() {super();} //标准安置者和吸气器未显示}

我们现在可以测试intValue字段确实不是序列化JSON输出的一部分:

@test public void givefieldisignoreddirectly_whendtoisserialized_thencorrect()抛出jsonparseexception,ioException {objectMapper映射器= new objectMapper();mydto dtooobject = new mydto();String dtoAsString = mapper.writeValueAsString(dtoObject);assertthat(dtoasstring,not(包含(“Intvalue”))));}

4.按类型忽略所有字段

最后,我们可以忽略指定类型的所有字段,使用@JsonIgnoreType注解。如果控制了类型,则可以直接注释类:

@jsonignoretype public class wondyype {...}

然而,往往不是我们没有控制班级本身;在这种情况下,我们可以充分利用杰克逊Mixins

首先,我们为我们想要忽略的类型的MixIn定义,并注释@JsonIgnoreType反而:

@jsonignoretype public class mymixinforignoretype {}

然后我们注册了Mixin以替换(并忽略)所有细绳[]在编组过程中的类型:

mapper.addmixinannotations(String []。类,mymixinforignoretype.class);

此时,所有的String数组将被忽略,而不是封送到JSON:

@Test public final void givenfieldtypeisignored_whendtoisserialized_thorrect () throws JsonParseException, IOException {ObjectMapper mapper = new ObjectMapper();mapper.addMixIn (String [] . class, MyMixInForIgnoreType.class);MyDtoWithSpecialField dtoObject = new MyDtoWithSpecialField();dtoObject.setBooleanValue(真正的);String dtoAsString = mapper.writeValueAsString(dtoObject);为了(dtoAsString containsString (intValue "));为了(dtoAsString containsString (booleanValue "));为了(dtoAsString,而不是(containsString(“stringValue”)));}

这是我们的DTO:

公共类mydtowithspecialfield {private string [] stringValue;私人INT INTVALUE;私人布尔booleanValue;}

注意:自版本2.5自版本 - 似乎我们无法使用此方法忽略原始数据类型,但我们可以将其用于自定义数据类型和数组。

5.忽略使用过滤器的字段

最后,我们还可以使用过滤器来忽略特定字段在杰克逊。首先,我们需要在Java对象上定义筛选器:

@JsonFilter("myFilter") public class MyDtoWithFilter{…}

然后,我们定义一个将忽略的简单过滤器intValue场地:

SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter . serializealleexception ("intValue");filterprovider筛选器= new simplefilterprovider().addfilter(“myfilter”,thefilter);

现在我们可以序列化对象并确保intValuejson输出中不存在字段:

@test公共最终viventypehasfilterthatignoresFieldByName_WhendToiserIalized_thencorrect()抛出jsonparseexception,ioException {objectMapper映射器= new objectMapper();SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter . serializealleexception ("intValue");filterprovider筛选器= new simplefilterprovider().addfilter(“myfilter”,thefilter);mydtowithfilter dtobject = new mydtowithfilter();String dtoasstring = mapper.writer(筛选器).writevalueastring(dtooobject);assertthat(dtoasstring,not(包含(“Intvalue”))));为了(dtoAsString containsString (booleanValue "));asserthat(dtoasstring,containstring(“StringValue”));system.out.println(dtoasstring);}

六,结论

本文演示了如何在序列化中忽略字段——首先通过名称,然后直接,最后——我们使用MixIns忽略了整个java类型,并使用过滤器对输出进行更多的控制。

可以找到所有这些示例和代码片段的实现我的GitHub项目

杰克逊底部

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

>>查看课程
对这篇文章的评论关闭!