【发布时间】:2018-08-21 20:22:42
【问题描述】:
当我使用 Jackson 多态序列化时,它会生成一个带有不正确的完全限定类名的 JSON 对象。
下面的代码序列化一个 XMLGregorianCalendar。输出是:
["java.util.GregorianCalendar",-3600000]
我预计会出现以下情况:
["javax.xml.datatype.XMLGregorianCalendar",-3600000]
为什么会输出 java.util.GregorianCalendar?
或者更重要的是:我该如何解决这个问题?
代码示例:
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import java.io.ByteArrayOutputStream;
public class JacksonGregorianProblem {
public static void main(String[] args) throws java.io.IOException, DatatypeConfigurationException {
XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar();
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
mapper.writeValue(byteArrayOutputStream, xmlGregorianCalendar);
System.out.println(byteArrayOutputStream);
}
}
【问题讨论】:
-
在检查了 Jackson 的源代码后,我明白为什么它会显示意外行为。在 com.fasterxml.jackson.databind.ext.XMLGregorianCalendarSerializer 类中,XMLGregorianCalendar 被强制转换为 GregorianCalendar。 github.com/FasterXML/jackson-databind/blob/… 所以这就解释了为什么会发生意外行为。
标签: java jackson gregorian-calendar xmlgregoriancalendar