使用Gson反序列化JSON数据

时间:2013-02-19 16:33:14

标签: java json deserialization gson

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

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

我想要创建的对象是

类型
com.vividsolutions.jts.geom.Point

我们使用此类是因为PostGis数据库用于空间数据。不幸的是,该类没有非arg构造函数,这是必需的。但不知何故,它还实现了CoordinateSequence CoordinateSequence,它既没有非arg构造函数。每当我尝试反序列化传入的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.

我尝试按照示例here为CoordinateSequence接口创建InstanceCreator,但没有成功。 同样继承Point并没有给出答案,因为问题在于CoordinateSequence的使用接口。

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

3 个答案:

答案 0 :(得分:1)

我们使用Custom 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;
}
}

答案 1 :(得分: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. 
  }
}

答案 2 :(得分:0)

服务器端:

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

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