0

我的 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 对象完全相同的格式。

任何快速帮助都会很棒。

4

1 回答 1

0

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());
    }
}

DatatypeFactoryjavax.xml.datatype.DatatypeFactory

然后Gson使用GsonBuilder您在其上注册该适配器的实例创建实例:

DatatypeFactory datatypeFactory = ...;
Gson gson = new GsonBuilder()
    .registerTypeAdapter(
        XMLGregorianCalendar.class,
        // Call `nullSafe()` to make adapter handle null values on its own
        new XMLGregorianCalendarTypeAdapter(datatypeFactory).nullSafe()
    )
    .create();
于 2020-09-30T20:51:25.787 回答