使用
在Spring Boot项目中,Jackson库默认是内置的,因此你通常不需要手动添加依赖。
创建实体类
public class User {
private String name;
private int age;
// getters and setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
在Controller中,你可以使用@ResponseBody
注解将Java对象自动转换为JSON响应。
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable int id) {
// 模拟从数据库或其他地方获取用户数据
User user = new User();
user.setName("John Doe");
user.setAge(30);
return ResponseEntity.ok(user); // 这里会自动转换为JSON
}
}
同样地,你也可以使用@RequestBody
注解将JSON请求体自动转换为Java对象。
@PostMapping("/create")
public ResponseEntity<User> createUser(@RequestBody User user) {
// 这里user对象已经是从JSON请求体中反序列化得到的
// 处理user对象,比如保存到数据库
return ResponseEntity.ok(user);
}
自定义序列化和反序列化
public class CustomUserSerializer extends StdSerializer<User> {
protected CustomUserSerializer() {
this(null);
}
public CustomUserSerializer(Class<User> t) {
super(t);
}
@Override
public void serialize(User value, JsonGenerator gen, SerializerProvider arg2)
throws IOException, JsonProcessingException {
gen.writeStartObject();
gen.writeStringField("name", value.getName());
gen.writeNumberField("age", value.getAge());
gen.writeEndObject();
}
}
然后在你的对象上使用@JsonSerialize
注解来指定自定义序列化器。
@JsonSerialize(using = CustomUserSerializer.class)
public class User {
// ...
}
对于反序列化,你也可以类似地创建自定义的反序列化器并使用@JsonDeserialize
注解。
配置jackson
你可以通过application.properties
或application.yml
文件配置Jackson的行为,或者在Spring配置中创建一个Jackson2ObjectMapperBuilderCustomizer
bean来定制ObjectMapper。
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: Asia/Shanghai
或者在Java配置中:
@Configuration
public class JacksonConfig {
@Bean
public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperBuilderCustomizer() {
return builder -> {
builder.serializers(new CustomSerializerModifier());
builder.deserializers(new CustomDeserializerModifier());
// 其他配置...
};
}
}
ObjectMapper的使用:
ObjectMapper
是核心类,用于在Java对象和JSON数据之间进行序列化和反序列化。
可以直接创建一个 ObjectMapper
的实例,然后重用它来处理多个序列化和反序列化操作。
import com.fasterxml.jackson.databind.ObjectMapper;
ObjectMapper objectMapper = new ObjectMapper();
User user = new User();
user.setName("John Doe");
user.setAge(30);
//使用 writeValueAsString 方法将Java对象转换为JSON格式的字符串。
String jsonString = objectMapper.writeValueAsString(user);
System.out.println(jsonString); // 输出:{"name":"John Doe","age":30}
//使用 readValue 方法将JSON字符串转换为Java对象。
User user = objectMapper.readValue(jsonString, User.class);
System.out.println(user.getName()); // 输出:John Doe
System.out.println(user.getAge()); // 输出:30
//反序列化使用TypeReference,这是一种类型安全的做法,比直接使用Class对象要有利,因为它可以捕获更多关于类型的细节,特别是在使用泛型时。
User user = objectMapper.readValue(jsonString, new TypeReference<User>() {});
ObjectMapper
也可以用来读取和写入JSON文件。
// 写入JSON文件
objectMapper.writeValue(new File("user.json"), user);
// 读取JSON文件
User userFromFile = objectMapper.readValue(new File("user.json"), User.class);
配置 ObjectMapper:
objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true); // 格式化输出
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 忽略未知属性
objectMapper.setSerializationInclusion(Include.NON_NULL); // 只序列化非空属性
注解的使用:
Jackson提供了很多注解来简化序列化和反序列化的过程,例如:
@JsonProperty
:用于指定JSON属性名。@JsonIgnore
:用于忽略某个属性的序列化和反序列化。@JsonFormat
:用于自定义日期、时间等类型的格式。@JsonSerialize
和@JsonDeserialize
:用于指定自定义的序列化器和反序列化器。- @JsonIgnoreProperties 忽略指定的属性
@JsonIgnoreProperties 说明:
当你使用Jackson将Java对象转换为JSON字符串,或者将JSON字符串转换为Java对象时,这个注解可以帮助你控制哪些属性应该被包括在内,哪些属性应该被忽略。
当你将@JsonIgnoreProperties
注解放在类上时,它会影响整个类的所有属性。你可以指定一个或多个要忽略的属性名。如果JSON字符串中包含了这些属性,但在Java类中没有对应的字段,那么在反序列化过程中这些属性会被忽略,不会抛出异常。同样地,如果Java类中的某些字段在JSON字符串中没有对应的属性,这些字段也不会被序列化。
@JsonIgnoreProperties({"password", "email"})
public class User {
private String username;
private String password;
private String email;
// getters and setters
}
在这个例子中,password
和email
属性在序列化和反序列化时都会被忽略。
也可以尝试将其用于属性级别,但这并不是它的典型用法。在属性级别上,更常用的注解是@JsonIgnore
,它用于忽略单个属性的序列化和反序列化。
使用@JsonIgnoreProperties
注解时,你还可以设置ignoreUnknown
属性为true
,这样当JSON字符串中包含Java类中不存在的属性时,Jackson不会抛出异常,而是会简单地忽略这些未知属性。
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
// class fields, getters, and setters
}
异常处理:
当序列化和反序列化过程中发生错误时,ObjectMapper
会抛出异常,通常是 JsonProcessingException
的子类。因此,你应该在调用 writeValue
和 readValue
方法时使用 try-catch 块来处理这些异常。
try {
String jsonString = objectMapper.writeValueAsString(user);
// ...
} catch (JsonProcessingException e) {
e.printStackTrace();
}