簡體   English   中英

Jackson 使用 @JsonRootName 反序列化具有額外屬性的 JSON

[英]Jackson deserialize JSON with extra properties using @JsonRootName

我想反序列化一個用@JsonRootName注釋的對象。 然而,傳輸對象的 JSON 包含另一個額外的屬性。 結果傑克遜抱怨:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (FIELD_NAME), expected END_OBJECT: Current token not END_OBJECT (to match wrapper object with root name 'account'), but FIELD_NAME at [Source: (ByteArrayInputStream); line: 1, column: 26] com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (FIELD_NAME), expected END_OBJECT: Current token not END_OBJECT (to match wrapper object with root name 'account'), but FIELD_NAME at [Source: (ByteArrayInputStream); line: 1, column: 26]

顯然, @JsonRootName注釋對象的反序列化僅在該對象是 JSON 文件中的唯一屬性"lastTransactionID" - 因為它不希望"lastTransactionID"在那里。

這是我的Account類:

@JsonRootName("account")
public class Account {
    private String id;
}

這是我需要反序列化的 JSON:

{
  "account": {
    "id": "1234"
  },
  "lastTransactionID": "1"
}

因為我使用的是 spring,所以我也有這個設置spring.jackson.deserialization.unwrap_root_value=true

有沒有辦法解決這個問題:

  • 必須編寫自定義解串器?

或者

  • 在反序列化發生之前攔截響應並剝離它的額外屬性?

看起來解決這個問題的最簡單方法是為Account類創建包裝器,並像往常一樣使用禁用的DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES功能反序列化 json。

public static class Wrapper {
    public Account account;
}

在這種情況下,其他字段將被忽略。

我知道這不是一個好的解決方案,但它解決了一個問題。

我們可以使用 ObjectMapper 將 json 映射到 java 對象。

public Account jsonToObject(Map<String, Object> map){
    ObjectMapper objectMapper = new ObjectMapper();
    Account account = objectMapper.convertvalue(map.get("account"),Account.class);
    return account;
}

您可以在 Account 類上使用JsonIgnoreProperties(ignoreUnknown=true)注釋。 請參閱以下鏈接了解更多詳情。
https://www.thetechnojournals.com/2019/10/entity-object-conversion-to-dto-object.html

暫無
暫無

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

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