使用Gson反序列化通用集合

时间:2011-06-19 14:16:29

标签: java json gson

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

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

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

相应的整体课程有以下字段:

...
String fieldA;
List<AnotherClass> = new ArrayList<AnotherClass>();
....

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

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

2 个答案:

答案 0 :(得分:4)

解除未命名的JSON数组的解决方案非常简单:

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

答案 1 :(得分:2)

反序列化时,如果要反序列化的最外层结构是泛型集合,则只需使用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;
}