日期的JSON序列化策略

时间:2014-06-25 10:17:27

标签: java json serialization

我遇到的问题是我有一些消费者是Java,有些是浏览器。我的目标浏览器是IE7 +(仅适用于IE7的json3)&铬。

对于浏览器,我希望将日期反序列化为Date JavaScript对象(使用JSON.parse()方法。对于Java消费者,我希望反序列化为java.util.Date Java对象。

鉴于我无法在浏览器端进行任何更改。我必须将消息序列化为以下内容:

{ myDate: new Date(<EPOCH HERE>) }

这当然会导致Java解串器出现问题。但是,我希望我可以用Gson来完成这项工作......我的想法是什么?

或者我应该采取不同的策略?

1 个答案:

答案 0 :(得分:2)

我通常使用注释@JsonSerialize@JsonDeserialize来解决此问题。我还使用ISO8601格式作为REST API日期的标准。

@JsonSerialize(using=JsonDateSerializer.class)
@JsonDeserialize(using=JsonDateDeserializer.class)
private Date expiryDate;

JsonDateSerializer

@Component
public class JsonDateSerializer extends JsonSerializer<Date>
{
    // ISO 8601
    private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

    @Override
    public void serialize(Date date, JsonGenerator gen, SerializerProvider provider)
            throws IOException, JsonProcessingException
    {
        String formattedDate = dateFormat.format(date);
        gen.writeString(formattedDate);
    }
}

JsonDateDeserializer

@Component
public class JsonDateDeserializer extends JsonDeserializer<Date>
{
    // ISO 8601
    private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

    @Override
    public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
            throws IOException, JsonProcessingException
    {
        try
        {
            return dateFormat.parse(jsonParser.getText());
        }
        catch (ParseException e)
        {
            throw new JsonParseException("Could not parse date", jsonParser.getCurrentLocation(), e);
        }
    }
}