我有一个json文件,并使用以下代码将json转换为Java POJO
reader = new JsonReader(new InputStreamReader(responseStream, "UTF-8"));
Gson gson = new GsonBuilder().create();
reader.beginObject();
while (reader.hasNext()) {
Example st = gson.fromJson(reader, Example.class);
}
我的json结构如下:
{
"$id": "students.json",
"type": "object",
"properties": {
"project": {
"$id": "project",
"projectList": [
"ABC"
]
},
"students": {
"$id": "/properties/students",
"type": "array",
"subelements": {
"properties": {
"id": {
"$id": "/properties/students/subelements/properties/id",
"examples": [
"Y"
]
},
"dep": {
"$id": "/properties/students/subelements/properties/dep",
"examples": [
"X"
]
}
},
"required": [
"id",
"dep"
]
}
}
},
"required": [
"project"
]
}
我只需要学生列表中的students.subelements.id.examples [0]和students.subelements.dep.examples [0] 当前我的Java对象类是:
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"project",
"elements"
})
public class Example {
/**
* The project
* (Required)
*
*/
@JsonProperty("project")
@JsonPropertyDescription("The project code")
private String project;
@JsonProperty("elements")
private List<Student> elements = null;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
}
//student class
public class Student{
private String id;
private String dep;
}
我正面临以下异常:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was NAME at line 2 column 4 path $.
所以请帮助我,根据提供的json,我确切的java对象类是什么,而我只会从该类中获取必填字段?
答案 0 :(得分:1)
首先,出现错误的原因是,在您首次调用reader.beginObject();
之后,JSON阅读器将转到第二行“ $ id” ,即{{1 }}输入JSONToken
。
并且NAME
期望下一个JSON值为gson.fromJson(reader, Student.class);
类型,因此会发生错误。
由于仅需要JSON中的一小部分,并且路径也不是简单的,因此我们无法创建POJO来通过直接映射检索数据。如@ user10375692所建议的,我们可以实现BEGIN_OBJECT
接口以实现更灵活的映射。在JsonDeserializer
方法中,我们可以使用deserialize
API从特定路径检索数据。以下是一个示例。
JSONObject