23

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

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

这些是我为解析而创建的POJOimport (为简洁起见,我将省略这些语句):

(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

}

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

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

NullPointerException每当我尝试访问可解析对象(例如通过 a )时,我都会得到 a ListIterator。然而, Gson确实创建了我指定的类的对象,并且不会引发任何后续错误。

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

TIA

4

2 回答 2

38

那是不可能的。您需要修改 JSON 结构以将 , 等表示object1object2数组的项目。现在它们是一个对象的属性,显然不知道其中有多少(否则您没有尝试将其映射为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属性应该替换为String,因为它是无效的。

于 2010-05-19T12:48:58.360 回答
0

我认为 BalusC 为 GSon 的特定问题提供了很好的指导(通常是一对一的数据绑定);但万一您认为应该有更多的动态处理,您也可以考虑其他 JSON 处理包。许多包都有额外的或替代的映射方式:Json-lib、flexjson 和 Jackson 与 Gson 相比至少有一些补充。有些提供更松散的映射(您将事物的名称定义为类型),而另一些则实际支持多态类型(声明一个 Object 但实际上可以映射到已序列化的子类型)。

于 2010-08-21T16:46:08.007 回答