Gson和反序列化数组的对象

我想使用Gson反序列化从我的web服务返回的jsonstring

该结构将返回TypeDTO[]

TypeDTO就像

 int id; String name; ArrayList<ItemDTO> items[] 

ItemDTO就像

 int id; String name; Boolean valid; 

当我调用代码如下

 Gson gson = new Gson(); TypeDTO[] mytypes = (TypeDTO[]) gson.fromJson(reply, TypeDTO[].class); 

对象内的所有东西都是空的

但是,如果我使用

JSONArrayJSONObject把它们从org.json jar里面一块一块拉出来,它工作正常,并且相应地填充字段。

任何想法,我做错了什么? Gson非常快 还是我最好坚持我已经工作了?

谢谢,大卫

原始问题中的示例Java数据结构与注释中的JSON结构的描述不匹配。

JSON被描述为

“一个{对象与{对象}}数组的数组”。

就问题中所描述的types而言,将JSON转换成与JSON结构相匹配的Java数据结构,以便于与Gson进行简单的反序列化

“一个{TypeDTO对象,数组{ItemDTO对象}}的数组”。

但问题中提供的Java数据结构不是这样的。 相反的

“一个{TypeDTO对象,一个{ItemDTO对象}的数组}的数组”。

一个二维数组!=一维数组。

这个第一个例子演示了如何使用Gson简单地反序列化和序列化一个JSON结构,该结构是“{对象具有{object}}数组的数组”。

input.json内容:

 [ { "id":1, "name":"name1", "items": [ {"id":2,"name":"name2","valid":true}, {"id":3,"name":"name3","valid":false}, {"id":4,"name":"name4","valid":true} ] }, { "id":5, "name":"name5", "items": [ {"id":6,"name":"name6","valid":true}, {"id":7,"name":"name7","valid":false} ] }, { "id":8, "name":"name8", "items": [ {"id":9,"name":"name9","valid":true}, {"id":10,"name":"name10","valid":false}, {"id":11,"name":"name11","valid":false}, {"id":12,"name":"name12","valid":true} ] } ] 

Foo.java:

 import java.io.FileReader; import java.util.ArrayList; import com.google.gson.Gson; public class Foo { public static void main(String[] args) throws Exception { Gson gson = new Gson(); TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class); System.out.println(gson.toJson(myTypes)); } } class TypeDTO { int id; String name; ArrayList<ItemDTO> items; } class ItemDTO { int id; String name; Boolean valid; } 

这个第二个例子使用了一个JSON结构,它实际上是“一个{TypeDTO对象的数组,{ItemDTO对象的一个​​数组}}的数组”,以匹配最初提供的Java数据结构。

input.json内容:

 [ { "id":1, "name":"name1", "items": [ [ {"id":2,"name":"name2","valid":true}, {"id":3,"name":"name3","valid":false} ], [ {"id":4,"name":"name4","valid":true} ] ] }, { "id":5, "name":"name5", "items": [ [ {"id":6,"name":"name6","valid":true} ], [ {"id":7,"name":"name7","valid":false} ] ] }, { "id":8, "name":"name8", "items": [ [ {"id":9,"name":"name9","valid":true}, {"id":10,"name":"name10","valid":false} ], [ {"id":11,"name":"name11","valid":false}, {"id":12,"name":"name12","valid":true} ] ] } ] 

Foo.java:

 import java.io.FileReader; import java.util.ArrayList; import com.google.gson.Gson; public class Foo { public static void main(String[] args) throws Exception { Gson gson = new Gson(); TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class); System.out.println(gson.toJson(myTypes)); } } class TypeDTO { int id; String name; ArrayList<ItemDTO> items[]; } class ItemDTO { int id; String name; Boolean valid; } 

关于剩下的两个问题:

Gson是非常快的?

没有与其他反序列化/序列化API进行比较。 Gson传统上是 最慢的 。 据说Gson的当前和下一个版本包括显着的性能改进,尽pipe我没有find最新的性能testing数据来支持这些声明。

也就是说,如果Gson足够满足您的需求,那么因为它使得JSON反序列化非常容易,所以使用它可能是有意义的。 如果需要更好的performance,jackson可能是更好的select。 它提供了很多(甚至可能是所有)Gson的便利。

还是我最好坚持我已经工作了?

我不会。 我总是宁愿有一个简单的代码行像

 TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class); 

…很容易反序列化成一个复杂的数据结构,而不是三十行代码,否则将需要映射一块一块一块一次。