问题描述
我的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());
}
}
({DatatypeFactory
是javax.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();