我在使用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
的使用,但是当我的集合是另一个类的一部分时,我无法应用这些知识......
我真的很感激任何帮助来解决这个问题。
答案 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;
}