使用Gson反序列化通用集合

我使用GSon进行json反序列化有一些困难,我希望有人可以帮助我。

我想反序列化以下json片段:

{ "fieldA": "valueA", "myCollection": { "AnotherClass": [ { "objectAfieldA": "valueB", "objectAfieldB": "valueC" }, { "objectAfieldA": "valueD", "objectAfieldB": "valueE" } ] } } 

相应的整体类有以下字段:

 ... String fieldA; List = new ArrayList(); .... 

现在,我的问题是,当我反序列化时,使用fromJson(jsonSample, resultContainer.class) ,没有List元素,一切都很好,但是当我包含包含列表时,我得到一个NullPointerException 。 我已经阅读过如何处理generics类型的集合和TypeToken的使用,但是当我的集合是另一个类的一部分时,我无法应用这些知识……

我真的很感激任何帮助来解决这个问题。

反序列化时,如果要反序列化的最外层结构是generics集合,则只需要使用TypeToken 。 对于原始问题中的示例,情况并非如此。 因此,不需要使用TypeToken

问题似乎是JSON结构与尝试绑定的Java结构不匹配。

JSON结构定义

 an object with two elements element 1 is a string named "fieldA", element 2 is an object named "myCollection", which has one element the one element is an array named "AnotherClass", composed of objects with two elements element 1 is a string named "objectAfieldA", element 2 is a string named "objectAfieldB" 

因此,定义一个与之匹配的Java数据结构,反序列化将非常简单,无需任何自定义处理。 如果未提供这种匹配的Java结构,则需要自定义反序列化。

这是一个使用原始问题中的名称和类型的工作示例。

 import java.io.FileReader; import com.google.gson.Gson; public class Foo { public static void main(String[] args) throws Exception { Gson gson = new Gson(); resultContainer result = gson.fromJson(new FileReader("input.json"), resultContainer.class); System.out.println(gson.toJson(result)); } } class resultContainer { String fieldA; MyCollectionContainer myCollection; } class MyCollectionContainer { SomeOtherClass[] AnotherClass; } class SomeOtherClass { String objectAfieldA; String objectAfieldB; } 

用于实现未命名的JSON数组的解决方案非常简单:

 List lres = gson.fromJson(new FileReader("input.json"), new TypeToken>(){}.getType());