如何使用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结构来将object1
, object2
等表示为数组的项目。 现在他们是一个对象的属性,它显然不知道它们中有多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
属性应该被String
replace,因为它是无效的。
我认为BalusC对于GSon的具体问题给出了很好的指导(通常是一对一的数据绑定)。 但万一你认为应该有更多的dynamic处理,你也可以考虑其他的JSON处理包。 许多软件包都有额外的或替代的方法来绘制事物:与Gson相比,Json-lib,flexjson和Jackson至less增加了一些东西。 一些提供更宽松的映射(你定义types的东西的名称),其他的实际支持多态types(声明一个对象,但实际上可以映射到被序列化的子types)。