簡體   English   中英

如何根據鍵值對將JSON對象反序列化到接口的實現上?

[英]How do I deserialize a JSON object onto an implementation of an interface based on its key-value pairs?

我正在為Spring Boot應用程序設置控制器。 我希望控制器根據傳入的JSON字符串的鍵值對生成接口實現的實例。

界面:

public interface ShoppableItem {}

實施1:

public class GroceryItem implements ShoppableItem {

@JsonProperty("transactionId")
private Long transactionId;

@JsonProperty
@NotNull
private String itemName;

@JsonProperty
@NotNull
private Float weight;
}

實施2:

public class ClothingItem implements ShoppableItem {

@JsonProperty("transactionId")
private Long transactionId;

@JsonProperty
@NotNull
private String itemName;

}

(注意:如果提供了砝碼,則為雜貨,並且不能為null或“”。如果沒有提供砝碼,則為衣物)。

調節器

@Controller
public class Total {

  @PostMapping(value = "total")
  @ResponseStatus(HttpStatus.ACCEPTED)
  public String tester(@Valid @RequestBody ShoppableItem shoppableItem) {
    return shoppableItem.toString();
  }
}

JSON正文

{
"transactionId" : "123",
"itemName" : "whatever"
}

理想的結果是創建一個ClothingItem類型的實例。 當我嘗試執行此操作時,出現以下異常:

org.springframework.http.converter.HttpMessageNotReadableException:JSON解析錯誤:無法構造com.test.controllers.Models.ShoppableItem的實例:抽象類型要么需要映射到具體類型,要么具有自定義反序列化器,或者包含其他類型信息; 嵌套異常是com.fasterxml.jackson.databind.JsonMappingException:無法構造com.test.controllers.Models.ShoppableItem的實例:抽象類型要么需要映射到具體類型,要么具有自定義反序列化器,或者包含其他類型信息

這是我執行不正確的功能嗎? 我知道這可能不是最好的方法,因為僅創建2個端點來處理每種情況會更容易。

您可以通過在ShoppableItem接口中添加靜態工廠方法(用@JsonCreator注釋)來ShoppableItem 請注意,您需要使用@JsonProperty注釋其所有參數,以便Jackson知道如何將JSON屬性映射到方法參數。

public interface ShoppableItem {

    @JsonCreator
    public static ShoppableItem create(@JsonProperty("transactionId") Long transactionId,
                                       @JsonProperty("itemName") String itemName,
                                       @JsonProperty("weight") Float weight) {
        if (weight == null)
            return new ClothingItem(transactionId, itemName);
        else
            return new GroceryItem(transactionId, itemName, weight);
    }
}

然后,傑克遜在反序列化ShoppableItem時將使用該方法。

暫無
暫無

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

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