Jackson忽略字段不序列化字段的3种方法

本文详细介绍了Jackson库中用于忽略序列化和反序列化字段的两个注解:@JsonIgnore和@JsonIgnoreProperties。@JsonIgnore适用于单个字段,而@JsonIgnoreProperties则可以忽略类中的多个字段。此外,还讲解了@JsonIgnoreType及其动态应用,通过ObjectMapper的addMixIn方法可以忽略指定类型的字段。示例代码展示了如何在序列化过程中忽略特定字段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、为字段添加@JsonIgnore注解,可以忽略该字段的序列化和反序列化。

@JsonIgnore
private String author;

2、使用JsonIgnoreProperties注解忽略多个字段

@JsonIgnoreProperties({ "summary", "author" })
public class ArticleIgnoreProperties {

	private String title;
	private String summary;
	private String content;
	private String author;

}

JsonIgnore作用于单个字段,JsonIgnoreProperties作用于类的多个字段,两者都是用来忽略指定的字段。

除此之外,还有另外一个以JsonIgnore开头的注解JsonIgnoreType,用于忽略指定类型(类、接口)的字段。

JsonIgnoreType注解

使用JsonIgnoreType注解忽略指定类型的字段

在指定的类型上,添加@JsonIgnoreType注解,可以忽略该类型的字段进行序列化。

public class AnimalIgnoreType {

	private String name;
	private Date date;
	private Address address;

	@JsonIgnoreType
	public static class Address {
		private String city;
	}
}

使用JsonIgnoreType注解动态忽略指定类型的字段

前面使用JsonIgnoreType注解,忽略的类型是固定的。

利用ObjectMapper的addMixIn方法,可以动态的将JsonIgnoreType注解应用于其他数据类型。

public class AnimalIgnoreType {

	private String name;
	private Date date;
	private Address address;

	public static class Address {
		private String city;
		
	}

}

首先,定义一个空的类,并添加JsonIgnoreType注解。

@JsonIgnoreType
public class IgnoreType {}

在序列化时,调用ObjectMapper的addMixIn方法,将JsonIgnoreType注解应用于目标类。

下面的例子,会将IgnoreType类的注解,添加到Date和Address上,因此序列化时这两个类对应的字段会被忽略。

/**
 * 调用ObjectMapper的addMixIn方法,将@JsonIgnoreType注解应用于任意目标类.
 * 
 * @throws JsonProcessingException
 */
@Test
public void mixIn() throws JsonProcessingException {
	AnimalIgnoreType animal = new AnimalIgnoreType();
	animal.setName("sam");
	animal.setDate(new Date());
	
	AnimalIgnoreType.Address address = new AnimalIgnoreType.Address();
	address.setCity("gz");
	animal.setAddress(address);
	
	ObjectMapper mapper = new ObjectMapper();
	mapper.addMixIn(Date.class, IgnoreType.class);
	mapper.addMixIn(Address.class, IgnoreType.class);
	System.out.println(mapper.writeValueAsString(animal));
}

结果:{"name":"sam"}

《轻松学习Jackson》教程

### 配置 Jackson 以仅序列化公共字段 Jackson 默认会基于 Java Bean 的约定来处理字段序列化和反序列化,这意味着它通常依赖于 getter 和 setter 方法。然而,可以通过调整 `ObjectMapper` 的配置或使用特定注解来改变这一行为。 #### 使用 `VisibilityChecker` 来控制可见性 可以利用 `ObjectMapper.setVisibility()` 方法设置字段的访问级别。具体来说,通过指定 `Field` 的可见性为 `ANY` 或者只允许 `PUBLIC_ONLY`,能够实现仅序列化 public 字段的需求。 以下是具体的代码示例: ```java import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; public class Main { public static void main(String[] args) throws Exception { ObjectMapper mapper = new ObjectMapper(); // 设置仅序列化 public 字段 mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.PUBLIC_ONLY); ExampleClass example = new ExampleClass(); String result = mapper.writeValueAsString(example); System.out.println(result); // 输出结果只会包含 public 字段 } } class ExampleClass { public String publicField = "Public Value"; private String privateField = "Private Value"; protected String protectedField = "Protected Value"; } ``` 上述代码中设置了 `PropertyAccessor.FIELD` 只能检测到 `PUBLIC_ONLY` 属性[^1]。因此,在最终生成的 JSON 中,只有 `ExampleClass` 类中的 `publicField` 被序列化。 --- #### 利用注解方式实现更细粒度的控制 除了全局配置外,还可以通过注解的方式单独定义某些类的行为。例如,使用 `@JsonAutoDetect` 注解可以直接在类上声明哪些类型的成员变量应该被考虑用于序列化/反序列化过程。 下面是一个例子: ```java import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; @JsonAutoDetect(fieldVisibility = PropertyAccessor.FIELD, visibility = JsonAutoDetect.Visibility.PUBLIC_ONLY) class AnotherExampleClass { public String publicField = "Public Field"; private String privateField = "Private Field"; } ``` 在这个场景下,即使未修改 `ObjectMapper` 的默认配置,由于存在类级别的注解指示,仍然只会序列化 `AnotherExampleClass` 的 `publicField` 成员[^3]。 --- #### 注意事项 需要注意的是,默认情况下 Jackson 会自动暴露非公有 (non-public) 的字段除非特别指定了其他选项比如 `ANY`。另外,当混合使用注解与程序逻辑设定时,优先级可能会有所同,请务必测试实际效果确认预期一致。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值