我的 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
)
然后使用
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
是一个抽象类,并且您的类型适配器也应该处理子类。