【问题标题】:Configure Jackson to parse multiple date formats配置 Jackson 以解析多种日期格式
【发布时间】:2014-07-23 14:17:42
【问题描述】:

我正在处理一个项目,其中 JSON 有效负载中返回的日期格式不一致(这是另一个问题)。我正在进行的项目使用 Jackson 来解析 JSON 响应。现在我已经编写了一些反序列化器来处理它,但它并不优雅。

我想知道是否有一种方法可以使用一组可能的日期格式来配置 Jackson,以解析特定的响应,而不是为每种格式编写几个单独的反序列化程序。类似于how GSON handles the problem in this question

【问题讨论】:

标签: java android json jackson


【解决方案1】:

这是一个杰克逊多日期格式序列化器。

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;

public class MultiDateDeserializer extends StdDeserializer<Date> {
    private static final long serialVersionUID = 1L;

    private static final String[] DATE_FORMATS = new String[] {
        "MMM dd, yyyy HH:mm:ss",
        "MMM dd, yyyy"
    };

    public MultiDateDeserializer() {
        this(null);
    }

    public MultiDateDeserializer(Class<?> vc) {
        super(vc);
    }

    @Override
    public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        JsonNode node = jp.getCodec().readTree(jp);
        final String date = node.textValue();

        for (String DATE_FORMAT : DATE_FORMATS) {
            try {
                return new SimpleDateFormat(DATE_FORMAT).parse(date);
            } catch (ParseException e) {
            }
        }
        throw new JsonParseException(jp, "Unparseable date: \"" + date + "\". Supported formats: " + Arrays.toString(DATE_FORMATS));
    }
}

您可以简单地通过如下注释字段来使用它:

@JsonProperty("date") @JsonDeserialize(using = MultiDateDeserializer.class) final Date date,

【讨论】:

    【解决方案2】:

    与此同时,一个注解可用于更简单的解决方案:

    public class DateStuff {
        @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd,HH:00", timezone="CET")
        public Date creationTime;
    }
    

    【讨论】:

    • @Keno 对,但截至目前(jackson 2.9.9),它既不支持多个 @JsonFormat 注释也不支持 DateTimeFormatter 样式的可选部分。 @rouble 的答案目前是采用多种格式的方式:)
    【解决方案3】:

    更好的解决方案是改用StdDateFormat。它是 Jackson 的内置日期格式化程序,支持大多数日期格式的变体。像下面这样使用它

    StdDateFormat isoDate = new StdDateFormat();
    ObjectMapper mapper = new ObjectMapper();
    mapper.setDateFormat(isoDate);
    

    【讨论】:

    • StdDateFormat 已经是ObjectMapper 中的默认DateFormat
    猜你喜欢
    • 2013-01-09
    • 2020-09-14
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 2018-03-07
    • 1970-01-01
    • 2012-12-24
    相关资源
    最近更新 更多