Jackson的使用方法详解

一、最基础的 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);

相关推荐
似水এ᭄往昔2 小时前
【Linxu】--进程优先级和进程切换
linux·运维·服务器
A923A2 小时前
【小兔鲜电商前台 | 项目笔记】第八天
前端·vue.js·笔记·项目·小兔鲜
海参崴-2 小时前
Linux进程管理完全指南
linux·运维·服务器
DYuW5gBmH2 小时前
Chrome DevTools MCP 让 AI 无缝接管浏览器调试会话
前端·chrome·chrome devtools
CQU_JIAKE2 小时前
4.4【A】
运维·服务器
立莹Sir2 小时前
Spring Bean生命周期设计思想与源码深度剖析:从表象到本质的全面升级
java·spring·rpc
计算机毕业论文辅导2 小时前
毕业设计避坑指南:工资信息管理系统的设计与实现(Java+SpringBoot实战)
java·spring boot·课程设计
你不是我我3 小时前
【Java 开发日记】为什么要有 time _wait 状态,服务端这个状态过多是什么原因?
java·网络·php
User_芊芊君子3 小时前
别再乱用 ArrayList 了!这 4 个隐藏坑,90% 的 Java 开发者都踩过
android·java·数据库