Jackson 序列化跟反序列化

Jackson是一個款非常優秀的Json序列化跟反序列化的工具,Springboot默認的就是使用此對Json進行序列化跟反序列化的。

咋們工作中,常見的一些配置

  private static ObjectMapper objectMapper = new ObjectMapper();

  static {
    // 格式化輸出
//    objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
    // 對於未知的屬性拋出異常
    objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
    // 反序列化的時候,針對對象,如果是字段爲"",則不拋出異常,轉爲null
    objectMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
    // 反序列化的時候,如果未知枚舉,轉爲NULL
    objectMapper.enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL);
    // 反序列化的時候,如果未知枚舉,轉爲默認的枚舉,需要在默認的枚舉上面添加 @JsonEnumDefaultValue 標識
    objectMapper.enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE);
    // 自定義序列化
    {
      JavaTimeModule javaTimeModule = new JavaTimeModule();
      javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());
      javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
      objectMapper.registerModule(javaTimeModule);
    }
  }

作爲一個全局的工具使用

對於某些類型需要自定義的序列化跟反序列化的話,可以參考 LocalDateTimeDeserializer 跟 LocalDateTimeSerializer,如下

//字符串的日期反序列化時間
public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
    @Override
    public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException{
        DateTimeFormatter dateTimeFormatter =  DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String dateTimeStr = jsonParser.getValueAsString();
        return  LocalDateTime.parse(dateTimeStr,dateTimeFormatter);
    }
}

序列化:


//時間序列化時變爲Str
public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
    @Override
    public void serialize(LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws
        IOException {
        DateTimeFormatter dateTimeFormatter =  DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        jsonGenerator.writeString(dateTimeFormatter.format(localDateTime));
    }
}

這個例子就完成了Java8的LocalDateTime的序列化跟反序列化了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章