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的序列化跟反序列化了