【问题标题】:Gson dateformat to serialize/deserialize unix-timestampsGson dateformat 序列化/反序列化 unix 时间戳
【发布时间】:2017-05-11 21:51:28
【问题描述】:

我正在使用 Gson 序列化/反序列化我的 pojo,目前正在寻找一种干净的方法来告诉 Gson 将日期属性解析/输出为 unix 时间戳。 这是我的尝试:

Gson gson = new GsonBuilder().setDateFormat("U").create();

来自 PHP,其中“U”是用于将日期序列化/反序列化为 unix 时间戳的日期格式,在运行我的尝试代码时,我是 RuntimeException

未知模式字符'U'

我假设 Gson 在引擎盖下使用 SimpleDateformat,它没有定义字母“U”。

我可以实现自定义DateTypeAdapter,但我正在寻找一种更简洁的方法来实现这一目标。只需更改 DateFormat 就可以了。

【问题讨论】:

    标签: java android gson date-format unix-timestamp


    【解决方案1】:

    创建自定义 TypeAdapter (UnixTimestampAdapter) 是可行的方法。

    UnixTimestampAdapter

    public class UnixTimestampAdapter extends TypeAdapter<Date> {
        @Override
        public void write(JsonWriter out, Date value) throws IOException {
            if (value == null) {
                out.nullValue();
                return;
            }
            out.value(value.getTime() / 1000);
        }
    
        @Override
        public Date read(JsonReader in) throws IOException {
            if (in == null) {
                return null;
            }
            return new Date(in.nextLong() * 1000);
        }
    }
    

    现在,您必须选择(取决于您的用例):

    1 - 如果您想在所有日期字段上应用此序列化,请在创建 Gson 实例时注册 UnixTimestampAdapter

    Gson gson = new GsonBuilder()
                       .registerTypeAdapter(Date.class, new UnixTimestampAdapter())
                       .create();
    

    2 - 如果您只想将其应用于某些特定字段,则使用 @JsonAdapter (如 @Marcono1234 建议的那样)注释您的日期字段。

    class Person {
        @JsonAdapter(UnixTimestampAdapter.class)
        private Date birthday;
    }
    

    【讨论】:

    • 嗨,您的回答解决了您在github.com/google/gson/issues/987 的问题,因为您拥有自己的解决方案,该解决方案以真正的 Gson 方式实现(不是解决方法,这是设计使然)。 :) 你能关闭这个问题吗?谢谢!
    • @LyubomyrShaydariv 感谢提醒我。您的请求已完成。 (你说得对,Gson 就是这样设计的)
    • 啊,还有一个注意事项:JsonReader.toString 返回一个人类可读的当前JsonReader 状态,如JsonReader at line 1 column 1 path $。可能有一个错字,in.nextString() 确实可以满足您在代码中的需要。甚至更短:new Date(in.nextLong() / 1000).
    • @AnixPasBesoin 您在读取覆盖时出错。必须是return new Date(in.nextLong() * 1000); Unix 时间戳以秒为单位,Date 构造函数需要毫秒。
    • 作为向 GsonBuilder 注册适配器的替代方法,您可以使用 @JsonAdapter 仅更改特定字段的序列化和反序列化。
    【解决方案2】:

    时间戳只是 long 的,所以你可以在你的 POJO 中使用它。或者,如果缺少该字段,请使用 Long 获取 null

    class myPOJO {
        Long myDate;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多