我如何建模可以处理动态字段的Gson对象?

时间:2013-08-03 23:24:28

标签: java json gson

我的应用程序正在与之通信的API发送响应,如下所示:

{
    Code: 200,
    Message: "HELLO",
    Data: []
}

数据字段始终是 SOMETHING 的数组。但某些可能是文本的单个节点,另一个其他的数组,或任何其他各种不同的对象。

在下面的示例中,数据节点是汽车对象数组的数组

Data: [ [ {car:1}, {car:2} ] ]

另一种返回类型可能是一个昆虫对象数组:

Data: [ {insect : spider} ]

我想设计一个Gson对象来处理这个问题,并想知道最好的方法是什么。

我的第一个想法是拥有一个包含CodeMessage字段的抽象类,然后有许多子类型都有自己的Data字段。然后我只需要调用.fromJson()将子类传递给它。

是否有更优化的设计方法,以便Gson能够处理差异?

2 个答案:

答案 0 :(得分:3)

我想出了我认为最好的答案。相当简单!

使类通用,并在传递给Gson之前通过创建TypeToken来提供类型:

   public class Response<T> {

        private String code;
        private String message;
        private List<T> data;
    }

然后使用Gson时:

   Type myCarListResponse = new TypeToken<Response<List<Car>>>(){}.getType();
   Response<List<Car>> response = gson.fromJson(json, myCarListResponse);

替换&gt;具有您期望从Data节点获得的类型。以上示例满足原始帖子中的第一个示例。

满足第二个例子:

  Type myInsectResponse = new TypeToken<Response<Insect>>(){}.getType();
  Response<Insect> response = gson.fromJson(json, myInsectResponse);

答案 1 :(得分:0)

在杰克逊,您可以使用@JsonAnyGetter/Setter来实现这一目标。

参考http://www.cowtowncoder.com/blog/archives/2011/07/entry_458.htmlhttp://wiki.fasterxml.com/JacksonFeatureAnyGetter