【jackson】@JsonDeserialize 和 @JsonSerialize

这篇博客介绍了如何使用Jackson的@JsonDeserialize和@JsonSerialize注解来处理序列化和反序列化的场景。文章通过一个实际案例,展示了如何在Java实体类的Integer类型性别字段与前端的“男/女”字符串之间进行转换。在反序列化时,利用JsonDeserializer的deserialize()方法对参数进行封装;在序列化时,使用JsonSerializer的serialize()方法将数据写出。博客还包含了测试部分,验证了控制器中保存和获取操作的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在这里插入图片描述

1.概述

转载:@JsonDeserialize 和 @JsonSerialize 基本使用

学习 【Spring】No suitable HttpMessageConverter repsonse type
这个主要是项目中国遇到了这个问题,然后来学习一下

2.【需求】

在前端性别显示“男 / 女”,而数据库中存储的是“1 / 0”,对应的 Pojo 也是使用的 Integer 类型,如何实现?

3.【实现方式】

  1. 通过使用工具类,在请求进入前,或响应前对参数进行处理,然后进行封装,此方法略

  2. 使用 @JsonDeserialize 和 @JsonSerialize 注解对在序列化和反序列化时对参数进行处理
    【Pojo 类】

3.1 @JsonDeserialize

是在反序列化时,所以就是对参数进行封装,故到的是 setXxxx() 方法,所以需要将注解添加到对应的 set 方法上,若使用了 Lombok 需要自己定义相应的 set 方法。

需要使用 using 属性指定处理参数的类,该类需要继承 JsonDeserializer 类,并重写 deserialize()。

3.2 @JsonSerialize

是在序列化时,所以需要获取数据,那么需要使用到 getXxxx() 方法,故需要将注解添加到对应的 get 方法上,若使用了 Lombok 需要自己定义相应的 get 方法。

需要使用 using 属性指定处理参数的类,该类需要继承 JsonSerializer 类,并重写 serialize()。

4.案例

4.1 实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person implements Serializable {
    private static final long serialVersionUID = 4346092911489022673L;

    private Integer id;
    private String name;
    private Integer age;

    /**
     * 1 男,0 女
     */
    private Integer gender;

    @JsonDeserialize(using = GenderJsonDeserializer.class)
    public void setGender(Integer gender) {
        this.gender = gender;
    }

    @JsonSerialize(using = GenderJsonSerializer.class)
    public Integer getGender() {
        return gender;
    }
}

4.2 GenderJsonDeserializer

【GenderJsonDeserializer 类】 其作用是处理参数,按照规则封装到指定的属性中,通过 p.getText() 获取参数。

@Component
@Slf4j
public class GenderJsonDeserializer extends JsonDeserializer {

    @Override
    public Integer deserialize(JsonParser p, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
            
        if (ObjectUtils.isEmpty(p)) {
            return null;
        }

        int gender = 0;

        switch (p.getText()) {
            case "男":
                gender = 1;
                break;
            case "女":
                break;
            default:
                throw new RuntimeException("传入的性别为非法字符!");
        }

        log.info("【 GenderJsonDeserializer.deserialize() 】  p.getText() ==> " 
        				+ p.getText() + ",转换后的结果 ==> " + gender);

        return gender;
    }
}

4.3 GenderJsonSerializer

【GenderJsonSerializer 类】 其作用是处理属性,按照规则封装到指定的参数中,通过value 获取属性,通过 gen.writeXxx() 方法写出参数。

@Component
@Slf4j
public class GenderJsonSerializer extends JsonSerializer {
    @Override
    public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) 
    		throws IOException {
    		
        log.info("【 GenderJsonSerializer.serialize() 】  value ==> " + value);
        if (value.equals(1)) {
            gen.writeString("男");
        } else if (value.equals(0)) {
            gen.writeString("女");
        }
    }
}

4.4 controller

用于测试

@PostConstruct 基本使用可以查看:https://blog.youkuaiyun.com/yage124/article/details/107322556

@RestController
@Slf4j
public class PersonController {
	// 使用集合模拟数据库中数据存储
    private List<Person> persons = new ArrayList<>();
	
	// 用于初始化数据,@PostConstruct 注解标注的方法,在构造器执行之后自动执行,只会执行一次
    @PostConstruct
    public void init() {
        persons.add(new Person(1, "张三", 18, 1));
        persons.add(new Person(2, "李四", 33, 0));
    }

    @PostMapping("/save")
    public Person savePerson(@RequestBody Person person) {
        log.info("【 PersonController.savePerson() 】  person ===> " + person);
        persons.add(person);
        log.info("集合内容为 ===> " + persons);
        return person;
    }

    @GetMapping("/find")
    public Person findPersonById(Integer id) {
        Person p = null;
        for (Person person : persons) {
           if (person.getId().equals(id)) {
               p = person;
               log.info("【 PersonController.findPersonById() 】  查询结果为:person ===> " + person);
           }
        }
        return p;
    }
}

5.【测试】

5.1 测试保存,即 Controller 中的 savePerson()

在这里插入图片描述
在这里插入图片描述

控制台输出:

【 GenderJsonDeserializer.deserialize() 】  p.getText() ==> 男,转换后的结果 ==> 1

【 PersonController.savePerson() 】  person ===> Person(id=3, name=王五, age=88, gender=1)

集合内容为 ===> [Person(id=1, name=张三, age=18, gender=1),
							 Person(id=2, name=李四, age=33, gender=0), 
							 Person(id=3, name=王五, age=88, gender=1)]
							 
【 GenderJsonSerializer.serialize() 】  value ==> 1

5.2 测试获取

在这里插入图片描述

控制台输出:
【 PersonController.findPersonById() 】  查询结果为:person ===> Person(id=2, name=李四, age=33, gender=0)

【 GenderJsonSerializer.serialize() 】  value ==> 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值