【问题标题】:Jersey + Gson not deserializing java.util.DateJersey + Gson 没有反序列化 java.util.Date
【发布时间】:2016-06-24 16:14:41
【问题描述】:

我遇到了一个使用 Jersey 和 Gson 进行 JSON 序列化/反序列化的小 servlet 的奇怪问题。实际上,我复制粘贴了为泽西岛编写的基本 Gson 提供程序,例如:http://eclipsesource.com/blogs/2012/11/02/integrating-gson-into-a-jax-rs-based-application/,一切似乎都工作正常,直到我尝试反序列化一个日期(采用标准 ISO 8601 格式),它总是被映射到我的 POJO为空。

我的第一次尝试是在返回 gsonBuilder 实例之前注册一个反序列化器类型适配器,如下所示:

import java.util.Date;

...

gsonBuilder.registerTypeAdapter(Date.class,
    new JsonDeserializer<Date>() {
        @Override
        public Date deserialize(JsonElement json, Type type,
                                JsonDeserializationContext arg2) throws JsonParseException {
            try {
                System.out.println(json);
                return (new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXX")).parse(json.getAsString());
            } catch (ParseException e) {
                return null;
            }
        }
    });

这不起作用,当我发送 POST 请求时没有打印任何内容。在返回之前,我尝试在 gsonBuilder 实例上使用setDateFormat 方法,但这并没有改变任何东西。

我认为还有其他一些实现 MessageBodyWriterMessageBodyReader 的类覆盖了我自己的实现,所以我试图删除我自己的实现,Jersey 抱怨它无法反序列化 JSON(所以没有其他供应商,我猜)。

我试图在我的MessageBodyReaderreadFrom 方法中设置断点,但请求实际上是在没有暂停执行的情况下反序列化的。

我应该提到我的类也包含不同的字段,一些字符串和一个日期:字符串总是被正确反序列化。

我尝试发送不同的日期,从2016-06-23T00:00:00.000+0200 开始(应该使用我在上面代码中使用的日期格式字符串进行格式化),然后通过删除一个部分来获得简单的2016-06-17,然后从来没有工作过。

我清理了我的 maven 项目,重新编译它,但它没有工作。

我认为可能是 Jetty 没有加载正确的类,所以我将相同的代码部署到 Tomcat 8 服务器中,结果是一样的。

我最后一次尝试是编写另一个并行的MessageBodyReader,但我没有将它设为通用Object 类型,而是创建了一个特定的java.util.Date 反序列化器,但似乎仍然没有调用readFrom 方法。

我真的不知道我现在可以尝试什么,你知道吗?

提前致谢。

【问题讨论】:

    标签: java json jersey jax-rs gson


    【解决方案1】:

    错误的原因在这里...

     try {
         System.out.println(json);
         return (new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXX")).parse(json.getAsString());
     } catch (ParseException e) {
         return null;
     }
    

    在这里更具体:

    "yyyy-MM-dd'T'HH:mm:ss.SSSXX"

    java Date 和 SimpleParser 最多只能保存 3 个位置的毫秒数,并且用于 SimpleDateFormat 的字符串中没有通配符 .SSSXX,因此您的解析器抛出异常,你正在捕捉但返回一个引用为 null 的日期, 尔格:

    Gson 正在处理一个空引用的对象,

    【讨论】:

    • 这仍然不起作用,我试图在末尾删除XX 或在异常捕获器中添加断点,但没有任何反应
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多