我有一个调用REST Web服务的帮助程序类。该帮助程序类在定义为通用“ R”的类中从Web服务接收信息。我可以轻松地使用GSON来读取POJO中的JSON,但无法弄清楚如何给它一个List并正确地读取它。

到目前为止,我已经尝试提取变量中R的类型并将其传递给List而不成功。我已经尝试过将Jackson与它的TypeFactory一起使用,但也没有成功,它不会将R作为其参数。

我想做的是这样的:

resource = new GsonBuilder().create().fromJson(response,List<R>)


或与杰克逊

resource = mapper.readValue(response, List<R>);


“响应”是我要返回的List实例的JSON字符串和资源。

我可以使用GSON或Jackson。我一直在尝试使用这两种方法,因为某些事情看起来可能彼此兼而有之。

我能够使它与非泛型一起工作,但是我所获得的只是一个JSON字段的Map列表列表。它基本上忽略了R的类型。

另外,R是从称为BaseResource的类扩展的,所以我知道R始终是BaseResource的子级,但是我需要的字段在该子级中。

奖励:我真正的最终目标是让我的通用R成为特定对象的列表。因此,如果我可以拥有:

resource = new GsonBuilder().create().fromJson(response,R)


和R可以是BaseResource或List。我已经使其适用于BaseResource,但是我需要通过使其大部分复制并明确声明其为List或将List传递给R来使其以某种方式使其适用于List。

我们当前的解决方法是使包装器包含一个列表:

private class Result{
    private List<BaseResource> result;
}


但是我们希望Web服务返回列表,而不是像这样的包装器。

最佳答案

使用GSON,您必须实现自己的序列化器,请参见:Type Information within serialized JSON using GSON

如果要使用Jackson,则可以使用@JsonTypeInfo批注解决此问题
多态类型:https://www.logicbig.com/tutorials/misc/jackson/jackson-json-type-info-annotation.html

10-01 09:32
查看更多