当处理Json
字符串XMLGregorianCalender
使用Gson
我得到异常:
了java.lang.RuntimeException:未能调用公共javax.xml.datatype.XMLGregorianCalendar中的()的无参数
这是由反序列化对象fromJson(..)
与Gson
具有XMLGregorianCalender
对象。
有什么可以为上述错误可能的解决方案?
当处理Json
字符串XMLGregorianCalender
使用Gson
我得到异常:
了java.lang.RuntimeException:未能调用公共javax.xml.datatype.XMLGregorianCalendar中的()的无参数
这是由反序列化对象fromJson(..)
与Gson
具有XMLGregorianCalender
对象。
有什么可以为上述错误可能的解决方案?
抽象类javax.xml.datatype.XMLGregorianCalendar
不能在其缺省的/无参数的构造,这使得实例化GSON
失败。
如果解决上面提到的扩展类和类有一个公共的无参数的构造可以反序列化直接。 例如,在我的情况:
XMLGregorianCalendar xmlGC = gson.fromJson(strXMLGC,
com.sun.org.apache.xerces.internal
.jaxp.datatype.XMLGregorianCalendarImpl.class);
一个通用的方法得到它的无处不在的工作-而无需关心实现类-是定义一个定制JsonDeserializer
。 为了使去serialing容易,你可以先创建保存的数据适配器类XMLGregorianCalendar
的JSON
有:
@Getter
public class XMLGregoriancalendarAdapterClass {
private BigInteger year;
private int month, day, timezone, hour, minute, second;
private BigDecimal fractionalSecond;
}
在上述类的每个字段的数据类型被选择为匹配一个具体方法用于构建XMLGregorianCalendar
与javax.xml.datatype.DatatypeFactory
。
具有上述适配器类创建一个去serialiazer,如:
public class XMLGregorianCalendarDeserializer
implements JsonDeserializer<XMLGregorianCalendar> {
@Override
public XMLGregorianCalendar deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
// Easily parse the adapter class first
XMLGregoriancalendarAdapterClass ac =
new Gson().fromJson(json,
XMLGregoriancalendarAdapterClass.class);
try {
// Then return a new newXMLGregorianCalendar
// using values in adapter class
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);