杰克逊JSON翻译

时间:2016-09-24 11:14:15

标签: java json groovy jackson

我正在与以不同标准发送日期的第三方WS集成。 例如消息正文:

{
  "date" : "2016-09-12T16:00:00+0000"
}

通过使用以下配置,jackson能够很好地将其反序列化为POJO:

public class Pojo {
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ssZ")
    ZonedDateTime date;

    public ZonedDateTime getDate() {
        return date;
    }

    public void setDate(ZonedDateTime date) {
        this.date = date;
    }
}

我的问题是我希望从一种模式反序列化date,然后将其序列化为我们系统使用的模式。我知道我可以在我的代码中分解映射和反序列化,但也许有更简洁的方法?

1 个答案:

答案 0 :(得分:1)

您可以专门使用@JsonDeserialize@JsonSerialize,并提供扩展StdSerializer / StdDeserializer的自定义序列化程序/反序列化程序。必须覆盖每个serializedeserialize方法。举个例子:

// Field
@JsonSerialize(using = CustomDateSerializer)
@JsonDeserialize(using = CustomDateDeserializer)
ZonedDateTime date

CustomDateSerializer

class CustomDateSerializer extends StdSerializer<ZonedDateTime> {

    private static DateTimeFormatter formatter = 
      DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm:ss")

    public CustomDateSerializer(Class<ZonedDateTime> t) {
        super(t) 
    }

    @Override
    public void serialize(Date value, JsonGenerator gen, SerializerProvider arg2) 
      throws IOException, JsonProcessingException {
        gen.writeString(formatter.format(value))
    }
}

同样,deserialization

class CustomDateDeserializer extends StdDeserializer<ZonedDateTime> {
 
    private static DateTimeFormatter formatter = 
      DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ")
 
    public CustomDateDeserializer(Class<?> vc) { 
        super(vc) 
    }
 
    @Override
    public Date deserialize(JsonParser jsonparser, DeserializationContext context) 
      throws IOException, JsonProcessingException {
        String date = jsonparser.getText()
        try {
            return ZonedDateTime.parse(formatter, date)
        } catch (DateTimeParseException e) {
            throw new RuntimeException(e)
        }
    }
}