在这个简短的教程中,我将向您展示如何在序列化时更改字段名称以映射到另一个JSON属性。
Jackson库提供了@JsonProperty
注解,用于改变序列化JSON中的属性名称。
依赖项
首先,在pom.xml
文件中添加以下依赖项:
xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
此依赖项还会自动引入以下库到类路径中:
jackson-annotations-2.9.8.jar
jackson-core-2.9.8.jar
jackson-databind-2.9.8.jar
始终建议使用Maven中央仓库中的最新版本。
更改字段名进行序列化
1. 不使用@JsonProperty
注解
我们先创建一个简单的Java类,并测试它而不添加@JsonProperty
注解。
User.java
java
package net.javaguides.jackson.annotations;
public class User {
public int id;
private String firstName;
private String lastName;
private String fullName;
public User(int id, String firstName, String lastName, String fullName) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
this.fullName = fullName;
}
// Getters and Setters
}
使用主方法测试上述代码:
JsonPropertyAnnotationTest.java
java
package net.javaguides.jackson.annotations;
import java.io.IOException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
public class JsonPropertyAnnotationTest {
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
User bean = new User(1, "Ramesh", "Fadatare", "Ramesh Fadatare");
String result = mapper.writeValueAsString(bean);
System.out.println(result);
}
}
输出结果如下:
json
{
"id" : 1,
"firstName" : "Ramesh",
"lastName" : "Fadatare",
"fullName" : "Ramesh Fadatare"
}
如你所见,如果不使用@JsonProperty
注解,那么属性名将与类中的getter和setter方法相同。
2. 使用@JsonProperty
注解
现在让我们给User
类的字段添加@JsonProperty
注解,来自定义输出,使得JSON格式如下所示:
json
{
"id" : 1,
"first_name" : "Ramesh",
"last_name" : "Fadatare",
"full_name" : "Ramesh Fadatare"
}
User.java (带@JsonProperty
注解)
java
package net.javaguides.jackson.annotations;
import com.fasterxml.jackson.annotation.JsonProperty;
public class User {
public int id;
@JsonProperty("first_name")
private String firstName;
@JsonProperty("last_name")
private String lastName;
@JsonProperty("full_name")
private String fullName;
public User(int id, String firstName, String lastName, String fullName) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
this.fullName = fullName;
}
// Getters and Setters
}
再次使用主方法测试修改后的代码:
JsonPropertyAnnotationTest.java
java
package net.javaguides.jackson.annotations;
import java.io.IOException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
public class JsonPropertyAnnotationTest {
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
User bean = new User(1, "Ramesh", "Fadatare", "Ramesh Fadatare");
String result = mapper.writeValueAsString(bean);
System.out.println(result);
}
}
输出结果如下:
json
{
"id" : 1,
"first_name" : "Ramesh",
"last_name" : "Fadatare",
"full_name" : "Ramesh Fadatare"
}
通过使用@JsonProperty
注解,您可以轻松地控制序列化过程中生成的JSON属性名称,从而满足特定的需求或符合外部API的要求。