Jackson自定义全局范围类型解析
有个业务需要自定义类型序列化器。OracleTimeSerializer
/**
* @ClassName OracleTimeSerializer
* @Description
* @Author LiuQian
* @Date 2022-11-13
**/
@JacksonStdImpl
public class OracleTimeSerializer extends StdScalarSerializer<TIMESTAMP> {
public OracleTimeSerializer() {
super(TIMESTAMP.class);
}
@Override
public void serialize(TIMESTAMP timestamp, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
try {
jsonGenerator.writeObject(timestamp.timestampValue());
} catch (SQLException throwables) {
throwables.printStackTrace();
jsonGenerator.writeString(timestamp.toString());
}
}
@Override
public JsonNode getSchema(SerializerProvider provider, Type typeHint) {
return this.createSchemaNode("string", true);
}
@Override
public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint) throws JsonMappingException {
this.visitStringFormat(visitor, typeHint, JsonValueFormat.DATE_TIME);
}
}使用方式有两种.
1.在全局ObjectMapper中使用SimpleModule
/**
* 创建Jackson对象映射器
*
* @param builder Jackson对象映射器构建器
* @return
*/
@Bean
public ObjectMapper getJacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
//序列换成json时,将所有的long变成string.因为js中得数字类型不能包含所有的java long值,超过16位后会出现精度丢失
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, com.fasterxml.jackson.databind.ser.std.ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, com.fasterxml.jackson.databind.ser.std.ToStringSerializer.instance);
simpleModule.addSerializer(TIMESTAMP.class, new OracleTimeSerializer());
objectMapper.registerModule(simpleModule);
//反序列化的时候如果多了其他属性,不抛出异常
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//日期格式处理
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
return objectMapper;
}2.在Bean中指定通过注释实现序列化器的注册
@JsonSerialize(using = OracleTimeSerializer.class)
public class Item {
...
}
本文链接:
/archives/1705844824965
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
刘同学的小站!
喜欢就支持一下吧