- 自定义序列化器需要继承 JsonSerializer 接口,泛型为需要被序列化的对象 重写 serialize() 方法
- 在需要序列化的实体类上加上注解 @JsonSerialize(using = TemplateSerialize.class)
- 指定序列化器
public class GeoJsonPointSerializer extends JsonSerializer<GeoJsonPoint> {
@Override
public void serialize(GeoJsonPoint value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
ser(value, gen, serializers, null);
}
@Override
public void serializeWithType(GeoJsonPoint value, JsonGenerator gen, SerializerProvider serializers, TypeSerializer typeSer) throws IOException {
ser(value, gen, serializers, typeSer);
}
private void ser(GeoJsonPoint value, JsonGenerator gen, SerializerProvider serializers, TypeSerializer typeSer) throws IOException {
gen.writeStartArray();
if (value != null) {
gen.writeNumber(value.getX());
gen.writeNumber(value.getY());
}
gen.writeEndArray();
}
}
public class GeoJsonPointDeserializer extends JsonDeserializer<GeoJsonPoint> {
@Override
public GeoJsonPoint deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {
return der(parser, context, null);
}
@Override
public Object deserializeWithType(JsonParser p, DeserializationContext ctxt, TypeDeserializer typeDeserializer) throws IOException {
return der(p, ctxt, typeDeserializer);
}
private GeoJsonPoint der(JsonParser parser, DeserializationContext context, TypeDeserializer typeDeserializer) throws IOException {
if (parser.isExpectedStartArrayToken()) {
JsonToken t = parser.nextToken();
if (t == JsonToken.END_ARRAY) {
return null;
}
GeoJsonPoint result;
if (t == JsonToken.VALUE_NUMBER_FLOAT) {
double x = parser.getDoubleValue();
t = parser.nextToken();
if (t == JsonToken.VALUE_NUMBER_FLOAT) {
double y = parser.getDoubleValue();
result = new GeoJsonPoint(x, y);
JsonToken jsonToken = parser.nextToken();
if(jsonToken==JsonToken.END_ARRAY){
return result;
}
}
}
}
return handleUnexpectedToken(context, parser, "Expected array.");
}
@SuppressWarnings("unchecked")
protected <R> R handleUnexpectedToken(DeserializationContext context,
JsonParser parser, String message, Object... args) throws JsonMappingException {
try {
return (R) context.handleUnexpectedToken(handledType(), parser.getCurrentToken(),
parser, message, args);
} catch (JsonMappingException e) {
throw e;
} catch (IOException e) {
throw JsonMappingException.fromUnexpectedIOE(e);
}
}
}