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