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

FK8*_*K82 22 java api serialization json gson

简而言之,这是我想在JAVA中解析的JSON对象的草图:

{
    object1: {
            item1: //[String | Array | Object] ,
            item2: // ...
            //<> more items
    object2: { /* .. */ }
    //<> more objects
}
Run Code Online (Sandbox Code Playgroud)

这些是我为解析而创建的POJO(import为了简洁,我将省略语句):

(1)完整JSON对象的表示

public class JObjectContainer {

    private List<JObject> jObjects ;

    public JObjectContainer() { }

    //get & set methods

}
Run Code Online (Sandbox Code Playgroud)

(2)嵌套对象的表示:

 public class JObject {

    private String id ;
    private List<JNode> jObjects ;

    public JObject() { } 

    //get & set methods

}
Run Code Online (Sandbox Code Playgroud)

(3)项目的代表:

 public class JNode {

    private JsonElement item1 ;
    private JsonElement item2 ;
    //<> more item fields

    public JNode() { }

    //get & set methods

}
Run Code Online (Sandbox Code Playgroud)

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

 Gson gson = new Gson() ;
 JObjectContainer joc = gson.fromJson(jsonFile,JObjectContainer.class) ;
Run Code Online (Sandbox Code Playgroud)

NullPointerException每当我尝试访问可解析对象时(例如通过a ListIterator),我都会得到一个.但是,Gson 确实创建了我指定的类的对象,并且不会抛出任何后续错误.

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

TIA

Bal*_*usC 38

那是不可能的.您需要修改您的JSON结构来表示object1,object2等作为的项目阵列.现在它们是一个对象的属性,显然它不知道它们中有多少(否则你没有尝试将它映射为a List).Gson很聪明,但不是那么聪明:)

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

{ nodes:
  [
    { item1: 'value1a', item2: 'value2a' },
    { item1: 'value1b', item2: 'value2b' },
    { item1: 'value1c', item2: 'value2c' }
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

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

public class Node {
    private String item1;
    private String item2;
    // +getters.
}
Run Code Online (Sandbox Code Playgroud)

而这个Gson的电话

Container container = new Gson().fromJson(json, Container.class);
Run Code Online (Sandbox Code Playgroud)

应该管用.

更新:要清楚,您的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 */
  ]
}
Run Code Online (Sandbox Code Playgroud)

只有JsonElement财产应该被替换String,因为它是无效的.

  • 是的我知道.你需要在JSON方面将这些项目分组为**数组**,使用`[`和`]`来识别它的开始和结束.只有这样你才能在`List`中收集它们.再次检查我的答案和该主题中的代码示例.我认为[本教程](http://www.hunlock.com/blogs/Mastering_JSON_%28_JavaScript_Object_Notation_%29)也可能有用. (2认同)