import包错误导致jackson @JsonSerialize 注解不工作

本文详细解析了在使用Jackson库进行对象序列化时遇到的问题,特别是针对日期字段的自定义序列化方法未能生效的情况。作者通过对比不同工程的配置,最终定位到问题根源在于ObjectMapper的版本冲突。

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

项目中需要用到jackson对对象进行序列化,对象中有日期字段,需要通过@JsonSerialize 注解来进行定制化序列化.
Pojo:

@JsonSerialize(using = XMLGregorianCalendar2StringSerializer.class)
private XMLGregorianCalendar fromDate;

自定义序列化方法:

public class XMLGregorianCalendar2StringSerializer extends JsonSerializer<XMLGregorianCalendar> {
  @jOverride
  public void serialize(XMLGregorianCalendar xmlGregorianCalendar, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
    jsonGenerator.writeString(xmlGregorianCalendar.toString());
  }
}

序列化:

ObjectMapper mapper = new ObjectMapper();
mapper.writeValueAsString(pojo)

测试中发现,自定义的序列化方法没有起作用,将断点放在自定义序列化方法上,代码未走到断点处,可以判断,该序列化方法没有被调用。
另外开一个新工程,用上述代码,可以正常执行自定义序列化方法。这种错误让笔者百思不得其解。
于是对比两个工程的文件,发现了问题所在:
在老工程中,ObjectMapper引入的是org.codehaus.jackson.map.ObjectMapper, 而新工程中,ObjectMapper引入的是com.fasterxml.jackson.databind.ObjectMapper,至此,问题得到解决。
究其原因,是笔者的老工程中使用了jersey包,里面包含了org.codehaus.jackson.map.ObjectMapper,笔者在使用IDE自动导入时,没有注意,就直接敲了回车,导致了问题产生。

假设我们有以下两个Java类: ```java public class Person { private String name; private int age; private Address address; // 构造函数、Getter和Setter方法省略 } public class Address { private String city; private String street; // 构造函数、Getter和Setter方法省略 } ``` 我们想要将一个Person对象序列化为JSON格式,需要在Person类上添加@JsonSerialize注解: ```java import com.fasterxml.jackson.databind.annotation.JsonSerialize; @JsonSerialize(using = PersonSerializer.class) public class Person { private String name; private int age; private Address address; // 构造函数、Getter和Setter方法省略 } ``` 其中,using属性指定了使用的自定义序列化器类PersonSerializer。 接下来,我们需要创建一个自定义序列化器类PersonSerializer: ```java import java.io.IOException; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; public class PersonSerializer extends JsonSerializer<Person> { @Override public void serialize(Person person, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeStartObject(); jsonGenerator.writeStringField("name", person.getName()); jsonGenerator.writeNumberField("age", person.getAge()); Address address = person.getAddress(); if (address != null) { jsonGenerator.writeObjectFieldStart("address"); jsonGenerator.writeStringField("city", address.getCity()); jsonGenerator.writeStringField("street", address.getStreet()); jsonGenerator.writeEndObject(); } jsonGenerator.writeEndObject(); } } ``` 在自定义序列化器类中,我们需要实现JsonSerializer抽象类的serialize方法,该方法中通过JsonGenerator对象Java对象序列化为JSON格式。 注意,我们在Person类中嵌套了一个Address对象,因此在自定义序列化器中需要对Address对象进行特殊处理。 最后,我们可以通过以下代码将Person对象序列化为JSON格式: ```java ObjectMapper objectMapper = new ObjectMapper(); Person person = new Person("张三", 20, new Address("北京", "朝阳区")); String json = objectMapper.writeValueAsString(person); System.out.println(json); ``` 输出结果如下: ```json { "name": "张三", "age": 20, "address": { "city": "北京", "street": "朝阳区" } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值