我在spring boot中使用locationtech JTS库,并使用json作为json序列化器和支持序列化JTS的JTS- geometry.The类型模块。我面临的问题是,当json返回时,坐标轴的顺序是长的,而不是长的。堆栈溢出https://stackoverflow.com/a/29634389/1574921上有一个解决方案,我想知道是否有其他方法来实现这个功能,而不是每当我创建一个功能时总是应用InvertCoordinateFilter。下面是我正在使用的代码
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JtsModule());
double lat = 32.3456789;
double lng = 72.423434;
GeometryFactory gf = new GeometryFactory();
Point point = gf.createPoint(new Coordinate(lng,lat ));
String json = mapper.writeValueAsString(point);
System.out.println(json);输出结果是
{"type":"Point","coordinates":[72.423434,32.3456789]}我希望输出结果是
{"type":"Point","coordinates":[32.3456789,72.423434]}发布于 2019-11-25 00:03:33
没有办法调整GeometrySerializer,因为顺序是硬编码在174-175行中的。
为了避免自己编写序列化程序,您可以只复制数据并反转这两行代码,但实际上您不会使用官方的jts- GeometrySerializer -type,而且除非您手动执行,否则将来对库的修改不会反映在复制的序列化程序中。
或者,只需修饰GeometrySerializer并在调用InverseCoordinateFilter之前使用它:
public static class CustomGeometrySerializer extends JsonSerializer<Geometry> {
private GeometrySerializer innerSerializer;
private InvertCoordinateFilter inverter = new InvertCoordinateFilter();
public CustomGeometrySerializer() {
this(new GeometrySerializer());
}
public CustomGeometrySerializer(GeometrySerializer innerSerializer) {
this.innerSerializer = innerSerializer;
}
@Override
public void serialize(Geometry value, JsonGenerator jgen,
SerializerProvider provider) throws IOException {
// Create a new Geometry to avoid mutating the original one
Geometry newValue = value.copy();
newValue.apply(inverter);
innerSerializer.serialize(newValue, jgen, provider);
}
private static class InvertCoordinateFilter implements CoordinateFilter {
public void filter(Coordinate coord) {
double oldX = coord.x;
coord.x = coord.y;
coord.y = oldX;
}
}
}现在,不用注册JtsModule,而是自己用反序列化程序创建一个模块:
ObjectMapper mapper = new ObjectMapper();
SimpleModule inverseJtsModule = new SimpleModule();
inverseJtsModule.addSerializer(Geometry.class, new CustomGeometrySerializer());
mapper.registerModule(inverseJtsModule);
double lat = 32.3456789;
double lng = 72.423434;
GeometryFactory gf = new GeometryFactory();
Point point = gf.createPoint(new Coordinate(lng, lat));
String json = mapper.writeValueAsString(point);
System.out.println(json);现在,您可以安全地序列化您的几何图形,而无需显式地反转每个几何图形。对于反序列化,您可以使用相同的方法,即装饰GeometryDeserializer。
https://stackoverflow.com/questions/59012335
复制相似问题