一、最基础的 Jackson 示例(无 Spring)
1.先引入Maven依赖
java
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.16.0</version>
</dependency>
2.Java对象
java
public class User {
private String name;
private Integer age;
// 必须有无参构造
public User() {}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; }
}
//或者
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Data
@NoArgsConstructor //一定要引入,要不然会报错
@AllArgsConstructor
public class User {
private String name;
private int age;
private String password;
private LocalDateTime time;
}
3.对象、Json互转
java
public class JacksonDemo {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// 对象 → JSON
User user = new User("Tom", 18);
String json = mapper.writeValueAsString(user);
System.out.println("JSON = " + json);
// JSON → 对象
User user2 = mapper.readValue(json, User.class);
System.out.println("User = " + user2.getName());
}
}
//或者才测试里面运行
@SpringBootTest
@Slf4j
public class BankApplicationTests {
@Test
public void contextLoads() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
// 对象 → JSON
User user = new User("Tom", 18);
String json = mapper.writeValueAsString(user);
System.out.println("JSON = " + json);
// JSON → 对象
User user2 = mapper.readValue(json, User.class);
System.out.println("User = " + user2.getName());
// 序列化:{"name":"zhangsan","age":18}
// 反序列化后的结果为:zhangsan
}
}
二、常用注解示例(重点)
1. @JsonProperty(改字段名)
java
public class User {
@JsonProperty("user_name")
private String name;
private Integer age;
}
java
{
"user_name": "Tom",
"age": 18
}
2. @JsonIgnore(忽略字段)
java
public class User {
private String name;
@JsonIgnore
private String password;
}
3. @JsonFormat(时间格式化)
java
public class Order {
private Long id;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
}
三、Java 8 时间类型(LocalDateTime)
1. 必须加的依赖
java
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
2. ObjectMapper 配置(关键)
java
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Order {
private int id;
private LocalDateTime createAt;
}
java
@Test
public void test01() throws JsonProcessingException {
ObjectMapper mapper=new ObjectMapper();
JavaTimeModule module = new JavaTimeModule();
//时间模块序列化
module.addSerializer(
LocalDateTime.class,
new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
);
//时间模块反序列化
module.addDeserializer(LocalDateTime.class,
new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
//注册模块
mapper.registerModule(module);
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
Order order=new Order(1,LocalDateTime.now());
String json=mapper.writeValueAsString(order);
log.info("订单序列化:{}",json);
Order o=mapper.readValue(json,Order.class);
log.info("订单的时间:{}",o.getCreateAt().toString());
}
四、集合 & 泛型
java
String json = "[{\"name\":\"Tom\",\"age\":18},{\"name\":\"Jerry\",\"age\":20}]";
List<User> users = mapper.readValue(
json,
new TypeReference<List<User>>() {}
);
users.forEach(u -> System.out.println(u.getName()));
五、Spring Boot 中完整示例(推荐)
1. Jackson 配置类
java
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
JavaTimeModule module = new JavaTimeModule();
module.addSerializer(
LocalDateTime.class,
new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
);
mapper.registerModule(module);
return mapper;
}
}
//可以自定义序列化的配置,继承SpringBoot中的ObjectMapper,不需要写@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")注解,直接全局配置
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;
/**
* 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象
* 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]
* 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
*/
public class JacksonObjectMapper extends ObjectMapper {
public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
//public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm";
public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
public JacksonObjectMapper() {
super();
//收到未知属性时不报异常
this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);
//反序列化时,属性不存在的兼容处理
this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
SimpleModule simpleModule = new SimpleModule()
.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))
.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
//注册功能模块 例如,可以添加自定义序列化器和反序列化器
this.registerModule(simpleModule);
}
}
2. Controller
SpringBoot中自定义了ObjectMapper,所以,我们只需要return new User("Tom", 18);就会自动转成Json对象,传给前端。
java
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/1")
public User getUser() {
return new User("Tom", 18);
}
@PostMapping("/save")
public String save(@RequestBody User user) {
System.out.println(user.getName());
return "ok";
}
}
六、常见错误示例(你以后一定会遇到)
1. 未知字段报错
{
"name": "Tom",
"age": 18,
"email": "a@b.com"
}
✅ 解决:
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
2. LocalDateTime 变成数组
{
"createTime": [2026, 4, 4, 16, 0, 0]
}
✅ 解决:
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);