3

我正在使用 Retrofit 和 JacksonConverter 从 API 获取 JSON 数据。

JSON 响应是这样的:-

[
  {
    "id": 163,
    "name": "Some name",
    "nested": {
      "id": 5,
      "name": "Nested Name",
      }
  }
]

但在我的班级中,我只想要父对象的 id、名称和嵌套对象的名称

我有这门课:-

@JsonIgnoreProperties(ignoreUnknown = true)
class A{
    @JsonProperty("id")
    int mId;

    @JsonProperty("name")
    String mName;

    @JsonProperty("nested/name")
    String mNestedName;
}

我不想为 A 中的嵌套对象创建另一个对象。我只想将嵌套对象的名称字段存储在 A 中。

上面的类不会抛出任何异常,但 mNestedName 将为空。

有没有办法得到这样的数据?我是否需要更改 mNestedName 的 @JsonProperty。

这就是我声明我的改造实例的方式

ObjectMapper mapper = new ObjectMapper();
       mapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        Retrofit retrofit = new Retrofit.Builder()
                .addConverterFactory(JacksonConverterFactory.create())
                .baseUrl(mBaseUrl)
                .client(okHttpClient)
                .build();
        return retrofit;

我正在通过这个获取数据:-

@GET("something/list/")
 Call<List<A>> getA(@Header("Authorization") String authorization);
4

1 回答 1

1

我没有改造经验,但如果你的问题主要与杰克逊有关。如果需要,可以通过使用 setter/getter 重构 A 类并将 setter 参数更改为通用对象来避免生成 POJO。

@JsonIgnoreProperties(ignoreUnknown = true)
public static class A{
    @JsonProperty("id")
    int mId;

    @JsonProperty("name")
    String mName;


    @JsonIgnoreProperties
    String mNestedName;

    public String getmNestedName() {
        return mNestedName;
    }

    @JsonProperty("nested")
    public void setmNestedName(Object mNestedName) {
        if(mNestedName instanceof Map) {
            this.mNestedName = (String)((Map)mNestedName).get("name");
        }
    }
于 2016-04-06T09:04:05.613 回答