场合
我有一个包含泛型类型的类,它还有一个非零的arg构造函数。我不想公开零arg构造函数,因为它可能导致错误的数据。
public class Geometries<T extends AbstractGeometry>{
private final GeometryType geometryType;
private Collection<T> geometries;
public Geometries(Class<T> classOfT) {
this.geometryType = lookup(classOfT);//strict typing.
}
}
有几个(已知的和最终的)类可以扩展AbstractGeometry。
public final Point extends AbstractGeometry{ ....}
public final Polygon extends AbstractGeometry{ ....}
示例json:
{
"geometryType" : "point",
"geometries" : [
{ ...contents differ... hence AbstractGeometry},
{ ...contents differ... hence AbstractGeometry},
{ ...contents differ... hence AbstractGeometry}
]
}
问题
如何编写将反序列化Generic Typed类(如Geometires)的JsonDeserializer?
CHEERS:)
P.S。我不相信我需要一个JsonSerializer,这应该是开箱即用的:)
答案 0 :(得分:0)
注意:此答案基于问题的第一个版本。编辑和后续问题改变了一些事情。
P.S。我不相信我需要一个JsonSerializer,这应该是开箱即用的:)
根本不是这样的。您发布的JSON示例与您显然想要绑定并生成的Java类结构不匹配。
如果您希望JSON像这样的JSON,那么您肯定需要自定义序列化处理。
JSON结构是
an object with two elements
element 1 is a string named "geometryType"
element 2 is an object named "geometries", with differing elements based on type
Java结构是
an object with two fields
field 1, named "geometryType", is a complex type GeometryType
field 2, named "geometries" is a Collection of AbstractGeometry objects
主要差异:
鉴于这种Java结构,匹配的JSON结构将是
an object with two elements
element 1, named "geometryType", is a complex object, with elements matching the fields in GeometryType
element 2, named "geometries", is a collection of objects, where the elements of the different objects in the collection differ based on specific AbstractGeometry types
你确定你发布的内容真的是你的意图吗?我猜测应该更改其中一个或两个结构。
关于多态反序列化的任何问题,请注意该问题已经在StackOverflow.com上讨论了几次。我在Can I instantiate a superclass and have a particular subclass be instantiated based on the parameters supplied发布了四个不同的问题和答案(其中一些带有代码示例)的链接。