Configure Jackson to parse multiple date formats

喜夏-厌秋 提交于 2021-02-17 21:57:28

问题


I am working on a project where the date formats returned in JSON payloads aren't consistent (that's another issue all together). The project I'm working on uses Jackson to parse the JSON responses. Right now I've written a few de/serializers to handle it but it's not elegant.

I want to know whether there's a way to configure Jackson with a set of possible date formats to parse for a particular response rather than writing several separate deserializers for each format. Similar to how GSON handles the problem in this question


回答1:


Here is a Jackson Multi Date Format Serializer.

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));
    }
}

You can use this simply by annotating a field as follows:

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



回答2:


In the meanwhile, an annotation became available for a much simpler solution:

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



回答3:


A better solution is to use StdDateFormat instead. It's Jackson's built-in Date formatter and supports most of the variations of Date formats. Use it like below

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


来源:https://stackoverflow.com/questions/24912992/configure-jackson-to-parse-multiple-date-formats

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!