配置 Jackson 以解析多种日期格式
我正在处理一个项目,其中JSON有效负载中返回的日期格式不一致(这是另一个问题)。我正在处理的项目使用 Jackson 来解析 JSON 响应。现在我已经写了一些de/序列化程序来处理它,但它并不优雅。
我想知道是否有一种方法可以使用一组可能的日期格式来配置Jackson来解析特定的响应,而不是为每种格式编写几个单独的反序列化器。类似于GSON如何处理这个问题中的问题
我正在处理一个项目,其中JSON有效负载中返回的日期格式不一致(这是另一个问题)。我正在处理的项目使用 Jackson 来解析 JSON 响应。现在我已经写了一些de/序列化程序来处理它,但它并不优雅。
我想知道是否有一种方法可以使用一组可能的日期格式来配置Jackson来解析特定的响应,而不是为每种格式编写几个单独的反序列化器。类似于GSON如何处理这个问题中的问题
下面是一个 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));
}
}
您只需按如下方式对字段进行注释即可使用它:
@JsonProperty("date") @JsonDeserialize(using = MultiDateDeserializer.class) final Date date,
与此同时,一个注释可用于更简单的解决方案:
public class DateStuff {
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd,HH:00", timezone="CET")
public Date creationTime;
}