使用GeoJson Jackson解析GeoJSON为Java对象失败,如何解决?
解决方案
异常的核心原因是Jackson无法为抽象类
Geometry创建实例,需要配置抽象类与具体实现类(Point、Polygon)的映射规则。
方法1:注册官方提供的GeoJsonModule(推荐)
你使用的geojson-jackson库已经内置了完整的类型映射模块,直接注册到ObjectMapper即可,不需要自行维护映射逻辑,适配所有标准GeoJSON类型:
import org.geojson.jackson.GeoJsonModule; import com.fasterxml.jackson.databind.ObjectMapper; // 初始化ObjectMapper后注册模块 ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(new GeoJsonModule()); // 执行原解析代码即可正常得到FeatureCollection对象 FeatureCollection featureCollection = objectMapper.readValue(json, FeatureCollection.class);
方法2:自定义反序列化器(仅适配Point、Polygon场景)
如果你的业务仅需要支持两种几何类型,也可以自行实现轻量的反序列化逻辑:
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import com.fasterxml.jackson.databind.module.SimpleModule; import org.geojson.Geometry; import org.geojson.Point; import org.geojson.Polygon; import java.io.IOException; // 构造自定义几何类型反序列化模块 SimpleModule customGeoModule = new SimpleModule(); customGeoModule.addDeserializer(Geometry.class, new StdDeserializer<Geometry>(Geometry.class) { @Override public Geometry deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { JsonNode geoNode = p.getCodec().readTree(p); String geometryType = geoNode.get("type").asText(); if ("Point".equals(geometryType)) { return p.getCodec().treeToValue(geoNode, Point.class); } else if ("Polygon".equals(geometryType)) { return p.getCodec().treeToValue(geoNode, Polygon.class); } throw new IllegalArgumentException("不支持的几何类型:" + geometryType); } }); // 注册自定义模块到ObjectMapper objectMapper.registerModule(customGeoModule); // 执行解析即可 FeatureCollection featureCollection = objectMapper.readValue(json, FeatureCollection.class);
内容的提问来源于stack exchange,提问作者dorcsi
相关产品推荐
相关产品推荐

