Jackson @JacksonInject注解使用示例

x33g5p2x  于2022-09-23 转载在 其他  
字(5.2k)|赞(0)|评价(0)|浏览(475)

本文将介绍 Jackson @JacksonInject 注解使用示例。 @JacksonInject 注解用于指示注解属性的值将被注入。可以使用 Jackson ObjectMapper 类注入带有 @JacksonInject 的注释属性的值。 @JacksonInject 有助于读取 JSON。假设 JSON 数据缺少一些字段,并且我们希望类的相应属性有一个默认值,那么我们可以使用 @JacksonInject 注释。如果一个属性用 @JacksonInject 注释并且我们使用 ObjectMapper 注入了值,那么默认情况下如果没有对应的 JSON 字段,注入的值将是属性的值,如果有对应的 JSON 字段,则属性值将被相应的覆盖JSON 字段值。本文中我们将通过完整的示例讨论如何使用 @JacksonInject注解。

使用的技术

示例中使用的技术。

  1. Java 9
  2. Jackson 2.9.4
  3. Gradle 4.3.1
  4. Eclipse Oxygen

使用@JacksonInject注解

@JacksonInject 注解用于指示注解属性的值将由 ObjectMapper 类注入。它有两个可选元素,valueuseInput,它们如下所示。

value:定义要注入的值的逻辑 id。

@JacksonInject("catInput")
private String category;

这里 catInput 将是逻辑 ID。如果未分配 value 元素或(它为空白),则使用属性类型注入值。

useInput:它是布尔值,决定匹配的输入值是否用于注释属性。如果该值为 false,则输入值将被忽略。如果值为 true,则输入值将覆盖注入值。 useInput 的默认值是具有 true 值的 default

@JacksonInject(value= "catInput", useInput= OptBoolean.FALSE)
private String category;

我们也可以将 @JacksonInject@JsonProperty 一起使用。

@JsonProperty("writerBook")	
@JacksonInject("bookInput")
private Book book;

使用 ObjectMapper 注入值

我们将使用 ObjectMapper 类的 setInjectableValues 方法注入值。我们将讨论两种情况,一种是指定 value 元素,另一种是未指定。我们需要使用 Jackson InjectableValues.Std 来存储要注入的值。 InjectableValues.Std 使用简单的 Map 来存储值。找到初始化 ObjectMapperInjectableValues.Std 的代码片段。

ObjectMapper mapper = new ObjectMapper();
InjectableValues.Std injectableValues = new InjectableValues.Std();

案例 1:分配了 value 元素。

@JacksonInject("wnameInput")
private String name;
	
@JacksonInject("bookInput")
private Book book;

该值将使用 ObjectMapperInjectableValues.Std 的实例注入,如下所示。

injectableValues.addValue("wnameInput","Mahesh");
injectableValues.addValue("bookInput", new Book("Hibernate Tutorial", "Hibernate"));
		 
mapper.setInjectableValues(injectableValues);

Jackson 将搜索所有带有逻辑 id wnameInputbookInput@JsonProperty 注释属性,并分别在属性中注入值,如上所示。
案例 2:未分配 value 元素。

@JacksonInject
private String name;
	
@JacksonInject
private Book book;

该值将使用 ObjectMapperInjectableValues.Std 的实例注入,如下所示。

injectableValues.addValue(String.class,"Mahesh");
injectableValues.addValue(Book.class, new Book("Hibernate Tutorial", "Hibernate"));
		 
mapper.setInjectableValues(injectableValues);

Jackson 将搜索 StringBook 类型的所有属性,并将分别注入上面给出的值。

完整示例

这里我们将提供一个完整的 @JacksonInject 演示示例。我们将创建一个应用程序,其中使用 @JacksonInject 注释的属性将具有由 value 元素定义的逻辑 ID,并且某些属性将没有逻辑 ID。假设我们已经创建了我们的演示应用程序,记住以下用于 writer 的输入 JSON 数据。

{
  "writerId" : 110,
  "writerName" : "Mohit",
  "writerBook" : {
    "bookName" : "Learning Java",
    "bookCategory" : "Java"
  }
}

现在假设我们正在获取缺少字段的输入 JSON 数据,如下所示。

{
  "writerId" : 110
}

我们可以在上面的 JSON 数据中看到缺少 writerNamewriterBook 字段。这些字段将由 @JacksonInject 注释注入。现在找到完整的代码。
build.gradle

apply plugin: 'java'
apply plugin: 'eclipse'
archivesBaseName = 'concretepage'
version = '1' 
repositories {
    mavenCentral()
}
dependencies {
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.9.4'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.4'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.9.4'
}

Book.java

package com.concretepage;
import com.fasterxml.jackson.annotation.JacksonInject;
import com.fasterxml.jackson.annotation.JsonProperty;
public class Book {
	@JsonProperty("bookName")		
	private String name;
	
	@JsonProperty("bookCategory")	
	@JacksonInject
	private String category;  
	
  	public Book(){}
  	public Book(String name, String category) {
  		this.name = name;
  		this.category = category;
  	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getCategory() {
		return category;
	}
	public void setCategory(String category) {
		this.category = category;
	}
}

Writer.java

package com.concretepage;
import com.fasterxml.jackson.annotation.JacksonInject;
import com.fasterxml.jackson.annotation.JsonProperty;
public class Writer {
	@JsonProperty("writerId")	
	private Integer id; 
	
	@JsonProperty("writerName")
	@JacksonInject
	private String name;
	
	@JsonProperty("writerBook")	
	@JacksonInject("bookInput")
	private Book book;

	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Book getBook() {
		return book;
	}
	public void setBook(Book book) {
		this.book = book;
	}
}

JSONToObject.java

package com.concretepage;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.InjectableValues;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JSONToObject {
	public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
		 String jsonData = 
		    "{"
			  +"\"writerId\" : 111"
		   +"}";
		 ObjectMapper mapper = new ObjectMapper();
		 InjectableValues.Std injectableValues = new InjectableValues.Std();

		 injectableValues.addValue(String.class,"Default Value");
		 injectableValues.addValue("bookInput", new Book("Hibernate Tutorial", "Hibernate"));
		 
		 mapper.setInjectableValues(injectableValues);
		 
		 Writer writer = mapper.readValue(jsonData, Writer.class);
		 System.out.println(writer.getId()+", "+ writer.getName());
		 Book book = writer.getBook();
		 System.out.println(book.getName()+", "+ book.getCategory());
	}
}

输出

111, Default Value
Hibernate Tutorial, Hibernate

参考

Annotation Type JacksonInject
Jackson Annotations

相关文章