JsonException 在将 Java 对象转换为 JSON 时

问题描述 投票:0回答:1

即使在创建自定义类型适配器后,下面的代码也会以某种方式失败。它适用于其他类型,如字符串。知道我该如何解决这个问题。下面是代码:

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 json gson
1个回答
0
投票

我猜您使用的是 Java 17+。

从 Java 17 开始,强制执行模块系统,java-xml 不会导出内部类供其他模块使用。

参见:https://github.com/openjdk/jdk17/blob/74007890bb9a3fa3a65683a3f480e399f2b1a0b6/src/java.xml/share/classes/module-info.java

这就是为什么

XMLGregorianCalendarImpl
的字段对
GsonBuilder
不可用的原因。

https://github.com/openjdk/jdk17/blob/74007890bb9a3fa3a65683a3f480e399f2b1a0b6/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/datatype/XMLGregorianCalendarImpl.java

我不认为

GsonBuilder
可以使用对象的getters和setters。

所以你需要制作一个合适的 TypeAdapter 应该将

XMLGregorianCalendar
中的所有 getter 和 setter 映射到一个可以序列化的对象,比如
LocalDate
.

https://github.com/openjdk/jdk17/blob/74007890bb9a3fa3a65683a3f480e399f2b1a0b6/src/java.xml/share/classes/javax/xml/datatype/XMLGregorianCalendar.java

或者您只是从

XMLGregorianCalendar
切换到
LocalDate

© www.soinside.com 2019 - 2024. All rights reserved.