我正在做一个项目,JSON有效负载中返回的日期格式不一致(这是另一个问题)。我正在做的项目使用Jackson解析JSON响应。现在我已经编写了一些反序列化器来处理它,但它并不优雅。我想知道是否有一种方法可以用一组可能的日期格式来配置Jackson,以解析特定的响应,而不是为每种格式编写几个单独的反序列化器。
goqiplq21#
这是一个Jackson多日期格式串行化程序。
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; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.Instant; import java.util.Arrays; import java.util.stream.Collectors; /** * https://stackoverflow.com/a/42567051/11152683 */ public class MultiDateDeserializer extends StdDeserializer<Date> { private static final long serialVersionUID = 1L; private static final SimpleDateFormat[] DATE_FORMATTERS = new SimpleDateFormat[]{ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"), new SimpleDateFormat("yyyy-MM-dd HH:mm' UTC'") }; 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 (SimpleDateFormat formatter : DATE_FORMATTERS) { try { return formatter.parse(date); //.toInstant(); } catch (ParseException e) { } } throw new JsonParseException(jp, "Unparseable date: \"" + date + "\". Supported formats: " + Arrays.stream(DATE_FORMATTERS).map(SimpleDateFormat::toPattern).collect(Collectors.joining("; "))); } }
只需按如下方式为字段添加注解即可使用此功能:
@JsonProperty("date") @JsonDeserialize(using = MultiDateDeserializer.class) final Date date,
dpiehjr42#
与此同时,一个注解可以用于一个简单得多的解决方案:
public class DateStuff { @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd,HH:00", timezone="CET") public Date creationTime; }
omtl5h9j3#
更好的解决方案是使用StdDateFormat。它是Jackson内置的Date格式化程序,支持Date格式的大多数变体。
StdDateFormat
StdDateFormat isoDate = new StdDateFormat(); ObjectMapper mapper = new ObjectMapper(); mapper.setDateFormat(isoDate);
ct3nt3jp4#
您可以使用选择性区段来定义多种格式:
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; }
第一种定义了两种完全不同的格式,第二种只有一小部分是可选的。
4条答案
按热度按时间goqiplq21#
这是一个Jackson多日期格式串行化程序。
只需按如下方式为字段添加注解即可使用此功能:
dpiehjr42#
与此同时,一个注解可以用于一个简单得多的解决方案:
omtl5h9j3#
更好的解决方案是使用
StdDateFormat
。它是Jackson内置的Date格式化程序,支持Date格式的大多数变体。ct3nt3jp4#
您可以使用选择性区段来定义多种格式:
第一种定义了两种完全不同的格式,第二种只有一小部分是可选的。