3 способа игнорировать поля без сериализации полей в Джексоне

Java

В предыдущей статье мы узнали, как игнорировать поля со значением null 3 способа игнорировать пустые поля в Джексоне".

На практике может быть более распространенным игнорирование сериализации определенных полей, чем игнорирование пустых полей.

У Джексона есть различные и богатые методы сериализации и фильтрации полей. В этом разделе давайте сначала узнаем о 3 простых методах.

Эта статья основана на версии Jackson 2.11.2, начните изучение прямо сейчас.

Игнорировать одно поле с помощью аннотации JsonIgnore

Добавьте в поле аннотацию @JsonIgnore, чтобы игнорировать сериализацию и десериализацию поля.

public class ArticleIgnore {

	private String title;
	@JsonIgnore
	private String summary;
	private String content;
	@JsonIgnore
	private String author;

	// 省略setter、getter方法

	@Override
	public String toString() {
		return "ArticleIgnore [title=" + title + ", summary=" + summary + ", content=" + content + ", author=" + author
		        + "]";
	}

}
/**
 * 为字段添加@JsonIgnore注解,可以忽略该字段的序列化和反序列化。
 * 
 * @throws JsonProcessingException 
 */
@Test
public void jsonIgnore() throws JsonProcessingException {
	ArticleIgnore article = new ArticleIgnore();
	article.setTitle("title");
	article.setSummary("summary");
	article.setContent("content");
	article.setAuthor("author");
	
	ObjectMapper mapper = new ObjectMapper();
	System.out.println(mapper.writeValueAsString(article));
	
	String str = "{\"title\":\"title\",\"summary\":\"summary\",\"content\":\"content\",\"author\":\"author\"}";
	ArticleIgnore newArticle = mapper.readValue(str, ArticleIgnore.class);
	System.out.println(newArticle.toString());
}

Результаты:

{"title":"title","content":"content"}
ArticleIgnore [title=title, summary=null, content=content, author=null]

Игнорировать несколько полей с аннотацией JsonIgnoreProperties

Добавьте в класс аннотацию JsonIgnoreProperties, чтобы игнорировать сериализацию и десериализацию нескольких указанных полей.

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

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

	// 省略getter、setter方法

	@Override
	public String toString() {
		return "ArticleIgnoreProperties [title=" + title + ", summary=" + summary + ", content=" + content + ", author="
		        + author + "]";
	}

}
/**
 * 为类添加@JsonIgnoreProperties注解,忽略指定字段的序列化和反序列化。
 * 
 * @throws JsonProcessingException 
 */
@Test
public void jsonIgnoreProperties() throws JsonProcessingException {
	ArticleIgnoreProperties article = new ArticleIgnoreProperties();
	article.setTitle("title");
	article.setSummary("summary");
	article.setContent("content");
	article.setAuthor("author");
	
	ObjectMapper mapper = new ObjectMapper();
	System.out.println(mapper.writeValueAsString(article));
	
	String str = "{\"title\":\"title\",\"summary\":\"summary\",\"content\":\"content\",\"author\":\"author\"}";
	ArticleIgnoreProperties newArticle = mapper.readValue(str, ArticleIgnoreProperties.class);
	System.out.println(newArticle.toString());
}

Результаты:

{"title":"title","content":"content"}
ArticleIgnoreProperties [title=title, summary=null, content=content, author=null]

JsonIgnore действует на одно поле, а JsonIgnoreProperties действует на несколько полей класса, оба из которых используются для игнорирования указанных полей.

В дополнение к этому есть еще одна аннотация JsonIgnoreType, начинающаяся с JsonIgnore, которая используется для игнорирования полей указанного типа (класса, интерфейса).

Аннотация JsonIgnoreType

Используйте аннотацию JsonIgnoreType, чтобы игнорировать поля указанного типа.

Добавьте к указанному типу аннотацию @JsonIgnoreType, чтобы игнорировать поля этого типа при сериализации.

public class AnimalIgnoreType {

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

	@JsonIgnoreType
	public static class Address {
		private String city;

		// 忽略getter、setter方法

		@Override
		public String toString() {
			return "Address [city=" + city + "]";
		}
		
	}

	// 忽略getter、setter方法

	@Override
	public String toString() {
		return "AnimalIgnoreType [name=" + name + ", date=" + date + ", address=" + address + "]";
	}

}
/**
 * 如果需要忽略某个具体的类型(类、接口)的序列化,可以使用@JsonIgnoreType注解来实现。
 * 
 * @throws JsonProcessingException
 */
@Test
public void ignoreType() 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();
	System.out.println(mapper.writeValueAsString(animal));
	
	String jsonString = "{\"name\":\"sam\",\"date\":1601714443779,\"address\":{\"city\":\"gz\"}}";
	AnimalIgnoreType newAnimal = mapper.readValue(jsonString, AnimalIgnoreType.class);
	System.out.println(newAnimal.toString());
}

Результаты:

{"name":"sam","date":1601726994454}
AnimalIgnoreType [name=sam, date=Sat Oct 03 16:40:43 CST 2020, address=null]

Поскольку тип Address аннотирован типами игнорирования, поля этого типа игнорируются во время сериализации и десериализации.

Динамически игнорировать поля указанного типа с помощью аннотации JsonIgnoreType.

При использовании аннотации JsonIgnoreType ранее игнорируемый тип фиксируется.

С помощью метода addMixIn объекта ObjectMapper аннотацию JsonIgnoreType можно динамически применять к другим типам данных.

public class AnimalIgnoreType {

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

	public static class Address {
		private String city;

		// 省略getter、setter方法

		@Override
		public String toString() {
			return "Address [city=" + city + "]";
		}
		
	}

	// 省略getter、setter方法

	@Override
	public String toString() {
		return "AnimalIgnoreType [name=" + name + ", date=" + date + ", address=" + address + "]";
	}

}

Сначала определите пустой класс и добавьте аннотацию JsonIgnoreType.

@JsonIgnoreType
public class IgnoreType {}

При сериализации вызовите метод addMixIn объекта ObjectMapper, чтобы применить аннотацию 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"}

резюме

Если вам нужно игнорировать указанное поле, проще всего использовать аннотацию JsonIgnore.

Если необходимо игнорировать несколько полей, а иногда и корректировать их, использование аннотации JsonIgnoreProperties будет более гибким.

Иногда необходимо игнорировать поля указанного типа данных, а два вышеуказанных способа не очень удобны. Джексон предоставляет нам еще один способ использовать аннотацию JsonIgnoreType для игнорирования фиксированного типа или объединить метод addMixIn ObjectMapper для динамического игнорирования полей типа данных.

Ссылаться на

Easy Learning Jackson Руководство по разработке в кармане программиста

Woohoo. Возьмите арлингтон-терьера.com/Jackson-IGN…

обо мне

Публичный аккаунт: Binary Road

Руководство:996geek.com

Блог:binarylife.icu

二进制之路