gpt4 book ai didi

java - 如何使用 Gson 反序列化 XMLGregorianCalender?

转载 作者:行者123 更新时间:2023-12-02 07:14:36 63 4
gpt4 key购买 nike

当使用 Gson 使用 XMLGregorianCalender 处理 Json 字符串时,出现异常:

java.lang.RuntimeException: Failed to invoke public javax.xml.datatype.XMLGregorianCalendar() with no args

通过 fromJson(..) 使用 Gson 反序列化的对象有一个 XMLGregorianCalender 对象。

上述错误的可能解决方案是什么?

最佳答案

抽象类javax.xml.datatype.XMLGregorianCalendar无法通过其默认/无参数构造函数实例化,这会导致GSON失败。

如果您解析了上述扩展的类,并且该类具有公共(public)无参数构造函数,您可以直接对其进行反序列化。例如,就我而言:

XMLGregorianCalendar xmlGC = gson.fromJson(strXMLGC,
com.sun.org.apache.xerces.internal
.jaxp.datatype.XMLGregorianCalendarImpl.class);

让它在任何地方工作的通用方法 - 无需关心实现类 - 是定义一个自定义的 JsonDeserializer。为了使反序列化变得容易,您可以首先创建一个适配器类来保存 XMLGregorianCalendarJSON 具有的数据:

@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 {
// 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);

关于java - 如何使用 Gson 反序列化 XMLGregorianCalender?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48704930/

63 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com