XMLGregorianCalendar 在使用 GSON 时正在更改格式

问题描述 投票:0回答:1

我的 pojo 类有一些数据类型为 XMLGregorianCalendar 的字段。

 protected XMLGregorianCalendar driverBirthDate; //the value is  -"1967-08-13-05:45"

当我使用 GSON 将对象转换为 json 字符串时,输出会为此字段生成其他内容。

Gson gson = new Gson();    
String str = gson.toJson(pojoObj);

转换后 -

"driverBirthDate": {
                    "day": 13,
                    "hour": -2147483648,
                    "minute": -2147483648,
                    "month": 8,
                    "second": -2147483648,
                    "timezone": -345,
                    "year": 1967
                }

但是我需要 pojo 对象所保存的完全相同的格式。

任何快速帮助都会很棒。

spring-boot gson json-deserialization objectmapper xmlgregoriancalendar
1个回答
0
投票

Gson 将 XMLGregorianCalendar 输出为 JSON 对象的原因是因为它没有针对此类型的内置适配器,因此回退到基于反射的适配器,该适配器发出类的所有字段的值。

您可以通过创建自定义

TypeAdapter
来解决此问题:

public class XMLGregorianCalendarTypeAdapter extends TypeAdapter<XMLGregorianCalendar> {
    private final DatatypeFactory datatypeFactory;
    
    public XMLGregorianCalendarTypeAdapter(DatatypeFactory datatypeFactory) {
        this.datatypeFactory = Objects.requireNonNull(datatypeFactory);
    }
    
    @Override
    public XMLGregorianCalendar read(JsonReader in) throws IOException {
        return datatypeFactory.newXMLGregorianCalendar(in.nextString());
    }
    
    @Override
    public void write(JsonWriter out, XMLGregorianCalendar value) throws IOException {
        out.value(value.toXMLFormat());
    }
}

DatatypeFactory
javax.xml.datatype.DatatypeFactory

然后使用

Gson
创建
GsonBuilder
实例,在该实例上注册该适配器:

// Assumes that either the DatatypeFactory instance is thread-safe or you are
// not using the Gson instance from multiple threads
DatatypeFactory datatypeFactory = ...;
Gson gson = new GsonBuilder()
    .registerTypeHierarchyAdapter(
        XMLGregorianCalendar.class,
        // Call `nullSafe()` to make adapter handle null values on its own
        new XMLGregorianCalendarTypeAdapter(datatypeFactory).nullSafe()
    )
    .create();

在这里使用

registerTypeHierarchyAdapter
是必要的,因为
XMLGregorianCalendar
是一个抽象类,并且您的类型适配器也应该处理子类。

© www.soinside.com 2019 - 2024. All rights reserved.