如何使用Google的Gson API正确地反序列化JSON?

总之,这是我想要在JAVA中parsing的JSON对象的草图:

{ object1: { item1: //[String | Array | Object] , item2: // ... //<> more items object2: { /* .. */ } //<> more objects } 

这些是我为parsing而创build的POJO (为简洁起见,我将省略import语句):

(1)完整的JSON对象的表示

 public class JObjectContainer { private List<JObject> jObjects ; public JObjectContainer() { } //get & set methods } 

(2)嵌套对象的表示:

  public class JObject { private String id ; private List<JNode> jObjects ; public JObject() { } //get & set methods } 

(3)项目的表述:

  public class JNode { private JsonElement item1 ; private JsonElement item2 ; //<> more item fields public JNode() { } //get & set methods } 

现在,创build一个Gson实例(用于导入jsonFile FileReader ),

  Gson gson = new Gson() ; JObjectContainer joc = gson.fromJson(jsonFile,JObjectContainer.class) ; 

每当我尝试访问可parsing对象(例如通过ListIterator )时,我都会得到一个NullPointerException ListIterator 。 然而,Gson 确实创build了我指定的类的对象, 不会抛出任何后续的错误。

我知道这是以前做的。 那么,我错过了什么?

TIA

这是不可能的。 您需要修改您的JSON结构来将object1object2等表示为数组的项目。 现在他们是一个对象的属性,它显然不知道它们中有多less(否则你没有试图将它映射为一个List )。 Gson很聪明,但不是那么聪明:)

所以,作为一个基本的例子,这个带有数组的JSON结构:

 { nodes: [ { item1: 'value1a', item2: 'value2a' }, { item1: 'value1b', item2: 'value2b' }, { item1: 'value1c', item2: 'value2c' } ] } 

结合Java表示(不一定被称为POJO,而只是javabean或模型对象或值对象)。

 public class Container { private List<Node> nodes; // +getter. } public class Node { private String item1; private String item2; // +getters. } 

这个Gson电话

 Container container = new Gson().fromJson(json, Container.class); 

应该工作。

更新 :要清楚,你的JSON结构是问题,而不是你的Java对象结构。 假设你的Java对象结构正是你想要的,那么你的JSON结构应该如下所示让Gson去完成它的工作:

 { jObjects: [ { id: 123, jObjects: [ { item1: 'value1a', item2: 'value2a' }, { item1: 'value1b', item2: 'value2b' }, { item1: 'value1c', item2: 'value2c' } /* etc... commaseparated */ ] }, { id: 456, jObjects: [ { item1: 'value1d', item2: 'value2d' }, { item1: 'value1e', item2: 'value2e' }, { item1: 'value1f', item2: 'value2f' } /* etc... commaseparated */ ] } /* etc... commaseparated */ ] } 

只有JsonElement属性应该被Stringreplace,因为它是无效的。

我认为BalusC对于GSon的具体问题给出了很好的指导(通常是一对一的数据绑定)。 但万一你认为应该有更多的dynamic处理,你也可以考虑其他的JSON处理包。 许多软件包都有额外的或替代的方法来绘制事物:与Gson相比,Json-lib,flexjson和Jackson至less增加了一些东西。 一些提供更宽松的映射(你定义types的东西的名称),其他的实际支持多态types(声明一个对象,但实际上可以映射到被序列化的子types)。