gson Java LocalDate(& G)序列化器- InaccessibleObjectException

nkhmeac6  于 2023-11-18  发布在  Java
关注(0)|答案(2)|浏览(268)

我试图从一个包含LocalDate字段的类中创建一个JSON字符串,但总是得到这个错误:

Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private final int java.time.LocalDate.year accessible: module java.base does not "opens java.time" to unnamed module @197ac685

字符串
我已经搜索了这个,显然我应该注册一个自定义适配器,我这样做了:

public class GsonLocalDateAdapter implements JsonSerializer<LocalDate>, JsonDeserializer<LocalDate> {

private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

@Override
public LocalDate deserialize(final JsonElement json, final Type typeOfT,
                             final JsonDeserializationContext context) throws JsonParseException {
    return LocalDate.parse(json.getAsString(), formatter);
}

@Override
public JsonElement serialize(LocalDate src, Type typeOfSrc, JsonSerializationContext context) {
    return new JsonPrimitive(src.format(formatter));
}
}

var gson = new GsonBuilder()
            .registerTypeAdapter(LocalDateTime.class, new GsonLocalDateAdapter())
            .create();
    var json = gson.toJson(myObject);


它甚至没有碰到serialize方法中的断点。我错过了什么吗?

daolsyd0

daolsyd01#

请参阅这篇关于堆栈溢出和相关讨论的文章:java.lang.reflect.InaccessibleObjectException:Unable to make field private final java.util.Map sun.reflect.annotation. Annotation异常
在您的情况下,您可以通过添加以下内容来解决此问题:

JAVA_TOOL_OPTIONS=--add-opens=java.base/java.time=ALL-UNNAMED

字符串

ldioqlga

ldioqlga2#

  • "...我试图从一个包含LocalDate字段的类中创建一个JSON字符串,但我总是得到这个错误:..."*

对于 registerTypeAdapter 方法,使用 LocalDate 而不是 LocalDateTime

registerTypeAdapter(LocalDate.class, new GsonLocalDateAdapter())

字符串

相关问题