如何从ArrayList获取GeoPoint积分?

时间:2013-10-08 15:37:04

标签: java android json gson

有谁知道我怎么能转换这个

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

GeoPoint

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:1)

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

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

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

  1. 您的JSON无效。有效的JSON必须是对象或列表,因此从{[开始。我保留你的JSON字符串,因为在99%的情况下,你没有控制你想要解析的字符串。
  2. GeoPoint:我找到了至少3个不同的包,其中包含此类:org.mapsforge.android.maps.GeoPointorg.andnav.osm.util.GeoPointcom.google.android.maps.GeoPoint。所有这些都有共同之处,那就是没有默认的构造函数。他们需要实例化两个双打或整数。所以我创建了一个“假的”GeoPoint类来回答这个问题,假设您想要使用其中一个。如果没有,另一个答案很合适,你真的不需要这个。
  3. 由于您没有默认构造函数,因此使用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);
        }
    
    }
    

    这是我的执行:

      

    Container [polygon = [GeoPoint [x = 23.5980319,y = 37.9554494],GeoPoint   [x = 23.5967015,y = 37.9557201]]]