杰克逊JSON翻译

问题描述:

我正在与第三方WS进行集成,这些WS以不同标准发送日期。 例如邮件正文:杰克逊JSON翻译

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

通过采用以下配置杰克逊能够很好地反序列化到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,然后将其序列化为一个由我们的系统使用。我明白我可以分解代码中的映射和反序列化,但也许有更清晰的方法?

+0

我很惊讶,它甚至可以编译,因为它应该是'@JsonFormat( pattern =“yyyy-MM-dd'T'HH:mm:ssZ”)'用双引号 –

+0

@NicolasFilotto它在GROOVY – Xeperis

+0

我想你应该在某处提及它 –

您可以具体使用@JsonDeserialize@JsonSerialize并提供自定义串行器/解串器,它可以扩展StdSerializer/StdDeserializerserializedeserialize方法必须被覆盖。举个例子:

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