如何使用GSON解串XMLGregorianCalender?(How to de-serializ

2019-09-29 08:17发布

当处理Json字符串XMLGregorianCalender使用Gson我得到异常:

了java.lang.RuntimeException:未能调用公共javax.xml.datatype.XMLGregorianCalendar中的()的无参数

这是由反序列化对象fromJson(..)Gson具有XMLGregorianCalender对象。

有什么可以为上述错误可能的解决方案?

Answer 1:

抽象类javax.xml.datatype.XMLGregorianCalendar不能在其缺省的/无参数的构造,这使得实例化GSON失败。

如果解决上面提到的扩展类和类有一个公共的无参数的构造可以反序列化直接。 例如,在我的情况:

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

一个通用的方法得到它的无处不在的工作-而无需关心实现类-是定义一个定制JsonDeserializer 。 为了使去serialing容易,你可以先创建保存的数据适配器类XMLGregorianCalendarJSON有:

@Getter
public class XMLGregoriancalendarAdapterClass {
    private BigInteger year;
    private int month, day, timezone,  hour, minute, second;
    private BigDecimal fractionalSecond;        
}

在上述类的每个字段的数据类型被选择为匹配一个具体方法用于构建XMLGregorianCalendarjavax.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);


文章来源: How to de-serialize XMLGregorianCalender with Gson?