配置Jackson以解析多种日期格式

Kur*_*hil 7 java android json jackson

我正在开发一个项目,其中JSON有效负载中返回的日期格式不一致(这是另一个问题).我正在研究的项目使用Jackson来解析JSON响应.现在我已经编写了一些de/serializers来处理它,但它并不优雅.

我想知道是否有一种方法可以为Jackson配置一组可能的日期格式来解析特定的响应,而不是为每种格式编写几个单独的反序列化器.类似于GSON在这个问题中处理问题的方式

rou*_*ble 14

这是一个Jackson多日期格式序列化器.

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

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

@JsonProperty("date") @JsonDeserialize(using = MultiDateDeserializer.class) final Date date,
Run Code Online (Sandbox Code Playgroud)


Ken*_*eno 6

同时,注释可用于更简单的解决方案:

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

  • @Keno 是的,但截至目前(jackson 2.9.9),这既不支持多个 `@JsonFormat` 注释,也不支持 [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/ time/format/DateTimeFormatter.html) 样式的可选部分。@rouble 的答案是目前采用多种格式的方法:) (2认同)

小智 6

您可以使用可选部分来定义多种格式:

public class DateStuff {
    @JsonFormat(pattern="[MMM dd, yyyy HH:mm:ss][MMM dd, yyyy][yyyy-MM-dd'T'HH:mm:ssZ]")
    public Date creationTime;
    @JsonFormat(pattern="MMM dd, yyyy[ HH:mm:ss]")
    public Date anotherCreationTime;
}
Run Code Online (Sandbox Code Playgroud)

第一个定义了两种完全不同的格式。第二个只有一小部分是可选的。