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
,因为它是无效的.