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

问题描述

我的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对象完全相同的格式。

任何快速帮助都很好。

解决方法

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());
    }
}

({DatatypeFactoryjavax.xml.datatype.DatatypeFactory

然后使用register适配器上的Gson创建GsonBuilder实例:

DatatypeFactory datatypeFactory = ...;
Gson gson = new GsonBuilder()
    .registerTypeAdapter(
        XMLGregorianCalendar.class,// Call `nullSafe()` to make adapter handle null values on its own
        new XMLGregorianCalendarTypeAdapter(datatypeFactory).nullSafe()
    )
    .create();

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...