1

我试图反序列化包含 GeoJSON 字符串的 JSON 字符串。

point: {
    type: "Point",
    coordinates: [
        7.779259,
        52.21864
    ]
}

我要创建的对象是类型

com.vividsolutions.jts.geom.Point

我们使用这个类是因为使用 PostGis 数据库存储空间数据。不幸的是,该类没有需要的非参数构造函数。但不知何故,它也实现了 CoordinateSequence CoordinateSequence,它既没有非参数构造函数。每当我尝试反序列化传入的 json 字符串时,都会出现错误

java.lang.RuntimeException: Unable to invoke no-args constructor for 
interface com.vividsolutions.jts.geom.CoordinateSequence. 
Register an InstanceCreator with Gson for this type may fix this problem.

我尝试按照此处的示例为 CoordinateSequence 的接口创建一个 InstanceCreator,但没有成功。子类化 Point 也没有带来答案,因为问题在于使用的 CoordinateSequence 接口。

我会感谢任何帮助或提示,这会引导我找到解决方案。

4

3 回答 3

1

我们使用自定义 JsonDeserializer 解决了它。当然,这只是一个快速而肮脏的解决方案。应该检查其他类型和错误。但这应该给出一个想法。

public class GeometryDeserializer implements JsonDeserializer<Geometry> {

@Override
public Geometry deserialize(JsonElement json, Type typeofT,
        JsonDeserializationContext context) throws JsonParseException {

    String type = json.getAsJsonObject().get("type").toString();

    JsonArray coordinates = json.getAsJsonObject().getAsJsonArray("coordinates");

    GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(null);
    Coordinate coord = new Coordinate(coordinates.get(0).getAsDouble(), coordinates.get(1).getAsDouble());
    Geometry point = geometryFactory.createPoint(coord);


    return point;
}
}
于 2013-02-20T17:00:19.190 回答
0

我假设该课程来自您无法更改的库。您是否尝试对类进行子类化并在子类中放置一个无参数构造函数只是为了帮助序列化过程?我以前做过,并取得了一些成功。

// .... content I cant change.
public class LibraryPOJOClass {
  public LibraryPOJOClass(final int id) { 
    // ...
  }
}

public class MyLibraryPojoClass extends LibraryPOJOClass {
  MyLibraryPojoClass() {
    super(0); // I will change this later, with reflection if need be. 
  }
}
于 2013-02-19T16:39:10.947 回答
0

做服务器端:

SELECT ST_GeomFromGeoJSON('{"type":"Point","coordinates":[7.779259,52.21864]}');

注意:问题中提供的示例看起来与The GeoJSON Format Specification略有不同。

于 2013-02-19T18:54:20.960 回答