本文将介绍 Jackson @JacksonInject
注解使用示例。 @JacksonInject
注解用于指示注解属性的值将被注入。可以使用 Jackson ObjectMapper
类注入带有 @JacksonInject
的注释属性的值。 @JacksonInject
有助于读取 JSON。假设 JSON 数据缺少一些字段,并且我们希望类的相应属性有一个默认值,那么我们可以使用 @JacksonInject
注释。如果一个属性用 @JacksonInject
注释并且我们使用 ObjectMapper
注入了值,那么默认情况下如果没有对应的 JSON 字段,注入的值将是属性的值,如果有对应的 JSON 字段,则属性值将被相应的覆盖JSON 字段值。本文中我们将通过完整的示例讨论如何使用 @JacksonInject
注解。
示例中使用的技术。
@JacksonInject
注解用于指示注解属性的值将由 ObjectMapper
类注入。它有两个可选元素,value
和 useInput
,它们如下所示。
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
类的 setInjectableValues
方法注入值。我们将讨论两种情况,一种是指定 value
元素,另一种是未指定。我们需要使用 Jackson InjectableValues.Std
来存储要注入的值。 InjectableValues.Std
使用简单的 Map
来存储值。找到初始化 ObjectMapper
和 InjectableValues.Std
的代码片段。
ObjectMapper mapper = new ObjectMapper();
InjectableValues.Std injectableValues = new InjectableValues.Std();
案例 1:分配了 value
元素。
@JacksonInject("wnameInput")
private String name;
@JacksonInject("bookInput")
private Book book;
该值将使用 ObjectMapper
和 InjectableValues.Std
的实例注入,如下所示。
injectableValues.addValue("wnameInput","Mahesh");
injectableValues.addValue("bookInput", new Book("Hibernate Tutorial", "Hibernate"));
mapper.setInjectableValues(injectableValues);
Jackson 将搜索所有带有逻辑 id wnameInput
和 bookInput
的 @JsonProperty
注释属性,并分别在属性中注入值,如上所示。
案例 2:未分配 value
元素。
@JacksonInject
private String name;
@JacksonInject
private Book book;
该值将使用 ObjectMapper
和 InjectableValues.Std
的实例注入,如下所示。
injectableValues.addValue(String.class,"Mahesh");
injectableValues.addValue(Book.class, new Book("Hibernate Tutorial", "Hibernate"));
mapper.setInjectableValues(injectableValues);
Jackson 将搜索 String
和 Book
类型的所有属性,并将分别注入上面给出的值。
这里我们将提供一个完整的 @JacksonInject
演示示例。我们将创建一个应用程序,其中使用 @JacksonInject
注释的属性将具有由 value
元素定义的逻辑 ID,并且某些属性将没有逻辑 ID。假设我们已经创建了我们的演示应用程序,记住以下用于 writer 的输入 JSON 数据。
{
"writerId" : 110,
"writerName" : "Mohit",
"writerBook" : {
"bookName" : "Learning Java",
"bookCategory" : "Java"
}
}
现在假设我们正在获取缺少字段的输入 JSON 数据,如下所示。
{
"writerId" : 110
}
我们可以在上面的 JSON 数据中看到缺少 writerName
和 writerBook
字段。这些字段将由 @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
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.concretepage.com/jackson-api/jackson-jacksoninject-example
内容来源于网络,如有侵权,请联系作者删除!