即使在创建自定义类型适配器后,下面的代码也会以某种方式失败。它适用于其他类型,如字符串。知道我该如何解决这个问题。下面是代码:
package com;
import java.io.IOException;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
public class DateConversion {
public static void main(String[] args) throws DatatypeConfigurationException {
XMLGregorianCalendar date = DatatypeFactory.newInstance().newXMLGregorianCalendar();
Request req = new Request();
req.setDate(date);
TypeAdapter<XMLGregorianCalendar> adapter = new TypeAdapter<XMLGregorianCalendar>() {
@Override
public void write(JsonWriter writer, XMLGregorianCalendar value) throws IOException {
System.out.println("Inside write");
if(value==null) {
writer.nullValue();
return;
}
writer.value("value");
}
@Override
public XMLGregorianCalendar read(JsonReader reader) throws IOException {
System.out.println("Inside read");
return null;
}
};
Gson gsonBuilder = (new GsonBuilder()).registerTypeAdapter(XMLGregorianCalendar.class, adapter).serializeNulls().create();
System.out.println(gsonBuilder.toJson(req));
}
}
class Request {
private XMLGregorianCalendar date;
public XMLGregorianCalendar getDate() {
return date;
}
public void setDate(XMLGregorianCalendar date) {
this.date = date;
}
}
下面是错误堆栈跟踪:
Exception in thread "main" com.google.gson.JsonIOException: Failed making field 'com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl#eon' accessible; either change its visibility or write a custom TypeAdapter for its declaring type
Java 对象应该成功解析为 JSON 但它不工作
我猜您使用的是 Java 17+。
从 Java 17 开始,强制执行模块系统,java-xml 不会导出内部类供其他模块使用。
这就是为什么
XMLGregorianCalendarImpl
的字段对 GsonBuilder
不可用的原因。
我不认为
GsonBuilder
可以使用对象的getters和setters。
所以你需要制作一个合适的 TypeAdapter 应该将
XMLGregorianCalendar
中的所有 getter 和 setter 映射到一个可以序列化的对象,比如 LocalDate
.
或者您只是从
XMLGregorianCalendar
切换到LocalDate
?