jackson - 使用 JTS jackson 时更改 lat long 的轴
问题描述
我在spring boot中使用locationtech JTS库,jackson作为json序列化器和一个支持序列化JTS几何的Jts-data-type模块。我面临的问题是返回json时坐标的轴顺序是long lat而不是lat长期以来,stackoverflow 上有一个解决方案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]}
解决方案
无法调整GeometrySerializer,因为订单在第174-175行中是硬编码的。
为了避免自己编写序列化程序,您可以复制GeometrySerializer
并反转这两行,但实际上您不会使用官方的 jts-data-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。
推荐阅读
- java - 重入锁对象锁定
- java - Netbeans Linux:Mojo 失败
- django - Django在发布前用sweetalert确认
- javascript - 如何在 Vue js 中使用 vue-meta 从动态数据中更新元信息?
- c# - 是否可以从应用程序执行的中间启动性能分析器?
- html - 我在注册表中哪里出错了?
- java - 如何使用 oracle 'rowid' 使用标准生成器进行排序
- json - 查询:{} 在邮递员的 whereHas 处返回,但表中有数据。拉拉维尔
- shell - 根据 shell 脚本中的参数将输出打印到控制台或文件中
- python - Python:如何在 Firefox 中自动化“允许”Flash 播放器内容?