簡體   English   中英

JSON 到 Java 對象 - 無法識別的字段,未標記為可忽略

[英]JSON to Java object - Unrecognized field, not marked as ignorable

我正在嘗試將以下 JSON 轉換為 java 對象。

{
  "Data":[
    {
      "AccountId":"2009852923",
      "Currency":"EUR",
      "Nickname":"SA 01",
      "Account":{
        "SchemeName":"BBAN",
        "Name":"SA 01",
        "Identification":"2009852923"
      },
      "Servicer":{
        "SchemeName":"BICFI",
        "Identification":"FNBSZAJJ"
      }
    },
    {
      "AccountId":"1028232942",
      "Currency":"EUR",
      "Nickname":"FNBCREDIT",
      "Account":{
        "SchemeName":"BBAN",
        "Name":"FNBCREDIT",
        "Identification":"1028232942"
      },
      "Servicer":{
        "SchemeName":"BICFI",
        "Identification":"FNBSZAJJ"
      }
    }
  ],
  "Links":{
    "self":"http://localhost:3000/api/open-banking/accounts/1009427721/transactions"
  },
  "Meta":{
    "total-pages":1
  }
}

使用以下 DTO(為簡潔起見,尚未發布引用的類)。

public class TransactionDTO {
    private Data[] data;
    private Links links;
    private Meta meta;
    public Data[] getData () {  return data; }
    public void setData (Data[] data) { this.data = data; }
    public Links getLinks () { return links; }
    public void setLinks (Links links) { this.links = links; }
    public Meta getMeta () { return meta; }
    public void setMeta (Meta meta) { this.meta = meta; }
}

將 DTO 轉換為 Java 對象的代碼是:

private TransactionDTO marshall(String accountTransactionsJSON) {
    ObjectMapper objectMapper = new ObjectMapper();
    TransactionDTO transactionDTO = null;
    try {
        transactionDTO = objectMapper.readValue(accountTransactionsJSON, TransactionDTO.class);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return transactionDTO;
}

我收到此錯誤:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "Data" (class xxx.dto.TransactionDTO), not marked as ignorable (3 known properties: "links", "data", "meta"])
 at [Source: java.io.StringReader@48f43b70; line: 2, column: 11] (through reference chain: xxx.dto.TransactionDTO["Data"])

我嘗試了不同的方法來解決這個問題,例如:

objectMapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

也:

@JsonRootName(value = "data")

但我要么遇到同樣的問題,要么沒有問題,但TransactionDTO僅包含null值。

我猜問題是Data字段,但我不知道如何解決這個問題(這里的解決方案對我也不起作用)。

問題

  1. 知道如何解決這個問題嗎?
  2. 訪問器案例是否應該反映 JSON 中的案例?

Jackson 默認區分大小寫。 嘗試這個:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);

我使用這種方法解決了類似的問題

ObjectMapper objectMapper = new ObjectMapper();

objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

問題是您的 JSON 屬性名稱(例如"Data" )與您的 Java 屬性名稱(例如data )不匹配。 除了@psmagin 的回答之外,還有兩個替代選項可以修復它:

  1. 保持 Java 代碼不變。 並在 JSON 內容中將所有鍵(從:留下的字符串)從第一個大寫更改為第一個小寫:

     { "data":[ { "accountId":"2009852923", "currency":"EUR", "nickname":"SA 01", "account":{ "schemeName":"BBAN", "name":"SA 01", "identification":"2009852923" }, .... }
  2. 保持 JSON 內容不變。 在您的 Java 代碼中,使用@JsonProperty批注告訴 Jackson 您的 Java 屬性的相應 JSON 屬性名稱:

     public class TransactionDTO { private @JsonProperty("Data") Data[] data; private @JsonProperty("Links") Links links; private @JsonProperty("Meta") Meta meta; public Data[] getData () { return data; } public void setData (Data[] data) { this.data = data; } public Links getLinks () { return links; } public void setLinks (Links links) { this.links = links; } public Meta getMeta () { return meta; } public void setMeta (Meta meta) { this.meta = meta; } }

    並以相同的方式在您的其他 Java 類( LinksMetaData ,...)

我更喜歡第一個選項,因為第一個小寫的屬性名稱是 JSON 和 Java 中既定的最佳實踐。

我收到此錯誤,因為我不打算將所有 JSON 字段映射到我的 POJO,但只有少數。 因此,它要求我將它們標記為忽略。 以下示例展示了這個想法:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Book {

@JsonProperty("kind")
private String kind;

@JsonProperty("id")
private String id;

@JsonProperty("volumeInfo")
private BookInfo bookInfo;

@Override
public String toString() {
    return "ClassPojo [kind = " + kind + ", id = " + id + ", bookInfo = " + bookInfo +"]";
}

另一方面,我的 Json 響應執行了 10 多個字段。

暫無
暫無

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

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