gpt4 book ai didi

具有可变维数组的 Java 对象

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:28:11 27 4
gpt4 key购买 nike

我正在尝试解析 GeoJSON使用 Gson ,我有一个看起来像这样的 JSON(简化):

{"type": "FeatureCollection",
"features": [
{ "type": "Feature", "name": "Afghanistan", "geometry":
{ "type": "Polygon", "coordinates":
<<a 3-dimensional double array (double[][][] in Java)>>
}
},
{ "type": "Feature", "name": "Indonesia", "geometry":
{ "type": "MultiPolygon", "coordinates":
<<a 4-dimensional double array (double[][][][] in Java)>>
}
},
//etc...
]
}

我需要有一个可以与 Gson 对象相关联的 java 类才能使用它,但我正在努力研究如何处理一组类似对象,这些对象的变量 coordinates 不是相同。我有相当于:

class FeatureCollection{
String type;
Feature[] features;
}
class Feature{
String type,name;
Shape geometry;
}
class Shape{
String type;
??? coordinates;
}
  • 当我尝试使用 double[][][] 而不是 ??? 时,我得到一个 com.google.gson.JsonSyntaxException: java .lang.IllegalStateException:应为 double 但在第 6 行第 146 列为 BEGIN_ARRAY
  • 当我尝试使 Shape 成为抽象类并使用 MultiPolygonPolygon 的子类时,Gson 尝试实例化一个 Shape 和错误。

我可以使用泛型或其他偷偷摸摸的东西来解决这个问题吗?

最佳答案

您需要有自己的自定义 JsonDeserializer因为 coordinates 变量没有一组定义的数组维度。我建议为形状使用一个接口(interface),然后为它编写一个反序列化器,如下所示:

public interface Shape {

ShapeType getType();

enum ShapeType { Polygon, MultiPolygon }
}

然后是每种类型的实现。 ShapeType.Polygon:

public class PolygonShape implements Shape {

private final ShapeType type = ShapeType.Polygon;
private double[][][] coordinates;

public ShapeType getType() {
return type;
}

public double[][][] getCoordinates() {
return coordinates;
}

public void setCoordinates(double[][][] coordinates) {
this.coordinates = coordinates;
}
}

ShapeType.MultiPolygon:

public class MultiPolygonShape implements Shape {

private final ShapeType type = ShapeType.MultiPolygon;
private double[][][][] coordinates;

public ShapeType getType() {
return type;
}

public double[][][][] getCoordinates() {
return coordinates;
}

public void setCoordinates(double[][][][] coordinates) {
this.coordinates = coordinates;
}
}

最后,您的反序列化器将依赖于每个实现的类型:

public class ShapeDeserializer implements JsonDeserializer<Shape> {

@Override
public Shape deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
ShapeType type = context.deserialize(jsonObject.get("type"), ShapeType.class);
switch (type) {
case Polygon:
return context.deserialize(json, PolygonShape.class);
case MultiPolygon:
return context.deserialize(json, MultiPolygonShape.class);
default:
throw new JsonParseException("Unrecognized shape type: " + type);
}
}
}

使用它,您还可以根据形状类型创建其他实现,并将它们添加到 switch 以支持它们。例如,要支持新的 Line 类型:

case Line:
return context.deserialize(json, LineShape.class);

不要忘记用 GsonBuilder.registerTypeAdapter 注册它方法:

GsonBuilder builder;
// ...
builder.registerTypeAdapter(Shape.class, new ShapeDeserializer());

关于具有可变维数组的 Java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18551587/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com