簡體   English   中英

傑克遜反序列化具有未知屬性名稱的泛型

[英]Jackson deserialize generic with unknown property name

我有以下JSON 我正在使用Jackson Parser進行解析

 {
  "code": 0,
  "response": {
    "pagination": {
        "page": 1,
        "limit": 20,
        "count": 5,
        "pageCount": 1
    },
   "random": [
      ....
     ]
  }
}

現在,我已經為各種random對象創建了簡單的POJO類。 我希望有3-4種不同類型的random對象。 因此,我沒有為不同類型的“隨機”對象創建不同的包裝器類,而是創建了一個通用類

編輯課程:

public class PaginatedResponse<E> {

   private Pagination pagination;
   private List<E> responseList;

   public Pagination getPagination() {
       return pagination;
   }

   public void setPagination(Pagination pagination) {
       this.pagination = pagination;
   }

   public List<E> getResponseList() {
       return responseList;
   }

   public void setResponseList(List<E> responseList) {
       this.responseList = responseList;
   }
}

現在我用來映射

  JsonNode tree = mapper.readTree(response);
  TypeReference<PaginatedResponse<LocationParent>> ref = new TypeReference<PaginatedResponse<LocationParent>>() {   };
  PaginatedResponse<LocationParent> resp = mapper.convertValue(tree.get("response"), ref);

但是我無法映射responseList 我得到了pagination對象,但responseList始終為null。 現在如何動態地為responseList提供property name

請幫忙

對於變量值類型,您需要處理多態類型。 僅泛型類型無濟於事,因為反序列化方面不知道要使用哪種類型。

您可以使用注解@JsonTypeInfo啟用多態類型處理; 但是在這種特殊情況下的一個問題是您想要一個任意類型的事物的List -由於類型擦除,所有Java列表實際上只是List<Object> 沒有元素的輸入。

如果是我,我可能會子類PaginatedResponse ,只是添加@JsonTypeInfo在基類,如:

@JsonTypeInfo(...) // see javadocs for properties needed
public abstract class PaginatedResponse<T> {
  public Pagination pagination;
  // .. and so on
}

public class PaginatedFooResponse<Foo> { }

在這里使用子類的原因僅僅是為了使反序列化器能夠在給定響應對象類型的情況下找出元素類型。 響應對象的類型為( PaginatedFooResposne ),並且可以使用該類型的元素。

嘗試這個::

JSONObject objJSON = JSONObject.fromString("urString");

String code = objJSON.get("code");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM