使用流API将json转换为Java POJO

时间:2018-09-18 12:20:02

标签: gson

我有一个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对象类是什么,而我只会从该类中获取必填字段?

1 个答案:

答案 0 :(得分:1)

错误原因

首先,出现错误的原因是,在您首次调用reader.beginObject();之后,JSON阅读器将转到第二行“ $ id” ,即{{1 }}输入JSONToken
并且NAME期望下一个JSON值为gson.fromJson(reader, Student.class);类型,因此会发生错误。

解决方案

由于仅需要JSON中的一小部分,并且路径也不是简单的,因此我们无法创建POJO来通过直接映射检索数据。如@ user10375692所建议的,我们可以实现BEGIN_OBJECT接口以实现更灵活的映射。在JsonDeserializer方法中,我们可以使用deserialize API从特定路径检索数据。以下是一个示例。

JSONObject