用于嵌套对象的 JacksonConverter 和 ObjectMapper

JacksonConverter and ObjectMapper for nested objects

我正在使用 Retrofit 和 JacksonConverter 从 API.

中获取 JSON 数据

JSON 响应是这样的:-

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

但是在我的class中我只想要父对象的id、名称和嵌套对象的名称

我有这个 class :-

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

    @JsonProperty("name")
    String mName;

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

我不想为A里面的嵌套对象再创建一个对象,我只想把嵌套对象的name字段存入A里面。

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

有没有办法像这样获取数据?我需要为 mNestedName 更改 @JsonProperty 吗?

这就是我声明 Retrofit 实例的方式

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);

我没有 Retrofit 方面的经验,但如果您的问题主要与 Jackson 有关。如果需要,可以通过使用 setter/getter 重构 A class 并将 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");
        }
    }