1

有谁知道我该如何转换这个

"polygon":[{"x":23.5980319,"y":37.9554494},{"x":23.5967015,"y":37.9557201}] 

使用GeoPointGson?

4

2 回答 2

1

快速回答:可能您需要编写一个自定义反序列化器。

详细回答:从这里到最后。

在回答之前有两件重要的事情。

  1. 您的 JSON 无效。有效的 JSON 必须是对象或列表,因此以{or开头[。我保留您的 JSON 字符串,因为在 99% 的情况下,您无法控制您尝试解析的字符串。
  2. GeoPoint: 我发现至少有 3 个不同的包里面有这个类org.mapsforge.android.maps.GeoPointorg.andnav.osm.util.GeoPointcom.google.android.maps.GeoPoint. 它们都有一个共同点,即没有默认构造函数。他们需要几个双精度数或整数才能被实例化。所以我创建了一个“假”GeoPoint 类来回答这个问题,假设你想使用其中一个。如果没有,其他答案很合适,你并不需要这个。

由于您没有默认构造函数,因此使用 Gson 的最佳方法是自定义反序列化器。我向您展示了我是如何使用以下代码解决它的。

public class Container {

    public List<GeoPoint> polygon;

    @Override
    public String toString() {
        return "Container [polygon=" + polygon + "]";
    }

}

然后是 YAGI(又一个 GeoPoint 实现),请注意我使用 a 和 b 作为成员变量,因为我不对内部进行假设GeoPoint(即 Gson 使用反射来填充字段)

public class GeoPoint {
    // this is not a real GeoPoint. Just a stub to avoid importing things
    // I do not want to import to answer!

    double a;
    double b;

    public GeoPoint(Double a, Double b){
        this.a = a;
        this.b = b;
    }

    @Override
    public String toString() {
        return "GeoPoint [x=" + a + ", y=" + b + "]";
    }


}

那么你需要一个反序列化器(这不起作用,com.google.android.maps.GeoPoint因为它使用 int,但你可以根据需要适应它)

public class GeoPointDeserializer implements JsonDeserializer<GeoPoint> {

    @Override
    public GeoPoint deserialize(JsonElement json, Type typeOfT,
            JsonDeserializationContext context) throws JsonParseException {
        if (json.isJsonNull())
            return null;

        Double x = json.getAsJsonObject().get("x").getAsDouble();
        Double y = json.getAsJsonObject().get("y").getAsDouble();
        return new GeoPoint(x, y);
    }

}

最后,这段代码完成了这项工作:

public class Q1925216 {

    public static void main(String[] args){

        String json = "\"polygon\":[{\"x\":23.5980319,\"y\":37.9554494},{\"x\":23.5967015,\"y\":37.9557201}]";

        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.registerTypeAdapter(GeoPoint.class, new GeoPointDeserializer());

        Gson gson = gsonBuilder.create();

        Container c = gson.fromJson("{"+json+"}", Container.class);

        System.out.println(c);
    }

}

这是我的执行:

容器 [多边形=[GeoPoint [x=23.5980319, y=37.9554494], GeoPoint [x=23.5967015, y=37.9557201]]]

于 2013-10-09T21:49:28.987 回答
1
class ClassA{
     List<Point> polygon;
}

class Point{
    double x;
    double y;
}

public static void main(String args[]){
    String json= "{\"polygon\":[{\"x\":23.5980319,\"y\":37.9554494},{\"x\":23.5967015,\"y\":37.9557201}]}";

    ClassA inpList = new Gson().fromJson(json, ClassA.class);
    for (Point point : inpList.polygon) {
        System.out.println(point.x);
        System.out.println(point.y);
    }
}
于 2013-10-08T16:12:36.813 回答