首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >配置Jackson以解析多种日期格式

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

Stack Overflow用户
提问于 2014-07-23 22:17:43
回答 3查看 17.8K关注 0票数 11

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

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

EN

回答 3

Stack Overflow用户

发布于 2017-03-03 06:15:39

这是一个Jackson多日期格式序列化程序。

代码语言:javascript
复制
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));
    }
}

您只需按如下方式注释字段即可使用此功能:

代码语言:javascript
复制
@JsonProperty("date") @JsonDeserialize(using = MultiDateDeserializer.class) final Date date,
票数 29
EN

Stack Overflow用户

发布于 2015-09-30 23:00:51

与此同时,一个注释变得可用于一个简单得多的解决方案:

代码语言:javascript
复制
public class DateStuff {
    @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd,HH:00", timezone="CET")
    public Date creationTime;
}
票数 4
EN

Stack Overflow用户

发布于 2021-01-18 00:38:01

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

代码语言:javascript
复制
StdDateFormat isoDate = new StdDateFormat();
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(isoDate);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24912992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档