有谁知道我该如何转换这个
"polygon":[{"x":23.5980319,"y":37.9554494},{"x":23.5967015,"y":37.9557201}]
使用GeoPoint
Gson?
快速回答:可能您需要编写一个自定义反序列化器。
详细回答:从这里到最后。
在回答之前有两件重要的事情。
{
or开头[
。我保留您的 JSON 字符串,因为在 99% 的情况下,您无法控制您尝试解析的字符串。GeoPoint
: 我发现至少有 3 个不同的包里面有这个类org.mapsforge.android.maps.GeoPoint
:org.andnav.osm.util.GeoPoint
和com.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]]]
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);
}
}