Gson,如何为通用类型类编写JsonDeserializer?

时间:2011-06-22 11:53:32

标签: gson

场合

我有一个包含泛型类型的类,它还有一个非零的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,这应该是开箱即用的:)

1 个答案:

答案 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

主要差异:

  1. JSON字符串与Java类型GeometryType
  2. 不匹配
  3. JSON对象与Java类型Collection
  4. 不匹配

    鉴于这种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发布了四个不同的问题和答案(其中一些带有代码示例)的链接。