抽象类javax.xml.datatype.XMLGregorianCalendar
不能通过其默认/无参构造函数实例化,这会导致GSON
失败。
如果您解析了扩展上述类的类,并且该类具有公共的无参构造函数,则可以直接反序列化它。例如,在我的情况下:
XMLGregorianCalendar xmlGC = gson.fromJson(strXMLGC,
com.sun.org.apache.xerces.internal
.jaxp.datatype.XMLGregorianCalendarImpl.class)
一种通用的方法,可以在不考虑实现类的情况下让它在任何地方都能工作-是定义一个自定义的JsonDeserializer
。为了使反序列化变得容易,您可以首先创建一个适配器类,该适配器类保存XMLGregorianCalendar
的JSON
数据:
@Getter
public class XMLGregoriancalendarAdapterClass {
private BigInteger year;
private int month, day, timezone, hour, minute, second;
private BigDecimal fractionalSecond;
}
以上类中每个字段的数据类型都被选为与使用
javax.xml.datatype.DatatypeFactory
构建
XMLGregorianCalendar
的一种具体方法相匹配。
使用上述适配器类创建一个反序列化程序,例如:
public class XMLGregorianCalendarDeserializer
implements JsonDeserializer<XMLGregorianCalendar> {
@Override
public XMLGregorianCalendar deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
XMLGregoriancalendarAdapterClass ac =
new Gson().fromJson(json,
XMLGregoriancalendarAdapterClass.class);
try {
return DatatypeFactory.newInstance()
.newXMLGregorianCalendar(ac.getYear(), ac.getMonth(),
ac.getDay(), ac.getHour(),
ac.getMinute(), ac.getSecond(),
ac.getFractionalSecond(), ac.getTimezone());
} catch (DatatypeConfigurationException e) {
e.printStackTrace();
}
return null;
}
}
使用上述方法可以构建类似于GSON
的:
Gson gson = new GsonBuilder().setPrettyPrinting()
.registerTypeAdapter(
XMLGregorianCalendar.class,
new XMLGregorianCalendarDeserializer() )
.create();
然后就只是:
XMLGregorianCalendar xmlGC2 =
gson.fromJson(json, YourClassHavingXMLGregorianCalendar.class);