java-在gson / retrofit中,是否有内置方法来处理各种格式的日期?

我当前使用的api以“ yyyy-MM-dd”的形式以及典型的ISO8601格式“ 2012-06-08T12:27”返回日期(出于这个问题,日期和日期时间相同) :29.000-04:00”

您如何“干净”地设置GSON来处理此问题?还是我最好的方法是使用模型对象中的一些自定义getter将日期视为字符串并以所需的特定形式输出?

我目前正在执行以下操作,但是只要看到“ yyyy-MM-dd”字段,解析就会失败.

return new GsonBuilder()
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
    .setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
    .create();

我最终将在Android Retrofit上下文中使用它,以防通过该途径有可用的解决方案.

编辑:根据以下建议,我创建了一个自定义TypeAdapter.我的完整解决方案可以在这里看到:https://gist.github.com/loeschg/2967da6c2029ca215258.

解决方法:

我会那样做:(尽管未测试):

SimpleDateFormat[] formats = new SimpleDateFormat[] {
    new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"),
    // Others formats go here
};

// ...

return new GsonBuilder()
    .registerTypeAdapter(Date.class, new TypeAdapter<Date>() {

        @Override
        public Date read(JsonReader reader) throws IOException {
            if (reader.peek() == JsonToken.NULL) {
                reader.nextNull();
                return null;
            }
            String dateAsString = reader.nextString();
            for (SimpleDateFormat format : formats) {
                try {
                    return format.parse(dateAsString);
                } catch (ParseException e) {}  // Ignore that, try next format
            }
            // No matching format found!
            return null;
        }
    })
    .create();

尝试多种格式的自定义类型适配器.

上一篇:android-预期为BEGIN_ARRAY,但在第1行第35列为BEGIN_OBJECT


下一篇:java-如何将json数组拆分为字符串?