【问题标题】:How to deserialize ISO 8601 datetime from Google Firebase?如何从 Google Firebase 反序列化 ISO 8601 日期时间?
【发布时间】:2017-09-08 23:40:38
【问题描述】:

TL;博士

如何将带有 ISO8601 字符串日期时间字段的 POJO 迁移到 Google Firebase 数据库,允许使用 Google GSON 进行自动反序列化?

说明

鉴于使用 Jackson annotations 编写的以下 POJO:

    @JsonIgnoreExtraProperties(ignoreUnknown = true)
    public class ChatMessage {

        public String name;
        public String message;

        @JsonFormat(
            shape = JsonFormat.Shape.STRING,
            pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
        )
        public Date createdAt;

        @JsonFormat(
            shape = JsonFormat.Shape.STRING,
            pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
        )
        public Date updatedAt;

        @JsonIgnore
        public String ignoreThisField;

    }

根据Firebase Database migration for Android,这就是ChatMessage 仅使用 GSON 时的样子:

public class ChatMessage {

    public String name;
    public String message;

    public Date createdAt;
    public Date updatedAt;

    @Exclude
    public String ignoreThisField;
}

我已经看到使用custom deserializers 的解决方案,但它需要重写几十个对象。

【问题讨论】:

    标签: android firebase firebase-realtime-database jackson gson


    【解决方案1】:

    基于custom (de)serializer post,我创建了一个Mapper类,自动将ISO 8601 string dates反序列化为Date

    public class Mapper {
    
        private static Gson GSON = new GsonBuilder()
                .setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
                .create();
    
        public static <T> T fromJson(Object object, Class<T> type) {
            String jsonString = GSON.toJson((HashMap<String, JSONObject>) object);
            return GSON.fromJson(jsonString, type);
        }
    
        public static String toJson(Object object) {
            return GSON.toJson(object);
        }
    
    }
    

    然后ChatMessage可以从

    ChatMessage msg = Mapper.fromJson(dataSnapshot.getValue(), ChatMessage.class);
    Timber.d(Mapper.toJson(msg));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多