有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Jackson JSON翻译

我正在与以不同标准发送日期的第三方WS集成。 e、 g.信息正文:

{
  "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) 个答案

  1. # 1 楼答案

    您可以专门使用@JsonDeserialize@JsonSerialize,并提供扩展^{}/^{}的自定义序列化程序/反序列化程序^必须重写每个{}和deserialize方法。例如:

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