簡體   English   中英

如何將JSON反序列化為已知必填字段但可能有多個未知字段的Java類?

[英]How can I deserialize a JSON to a Java class which has known mandatory fields, but can have several unknown fields?

我有一個輸入JSON,其中包含我確定內部的字段。 但是,我需要靈活地添加幾個額外的字段。 我不知道額外字段的名稱,但我必須處理它。

我在考慮添加一個包含所有額外字段的MaP字段,但輸入未映射到此字段。

我想在Dropwizard端點中反序列化JSON。

傑克遜有辦法嗎?

例:

JSON有效負載1:

{
  "first_name": "John",
  "last_name": "Doe",
  "date_of_birth": "01/01/1990",
  "postcode": "1234"
}

JSON有效負載2:

{
  "first_name": "Alice",
  "last_name": "Havee",
  "phone_no": 012345678,
  "passport_no": "AB 123456"
}

稍后,JSON有效負載3甚至可以具有不同的字段。

Java DTO:

public class PersonDTO {

    // mandatory field
    private String firstName;

    // mandatory field
    private String lastName;

    // Unknown optional fields?

    // No args constructor
    // Getters
    // Setters
}

您可以使用JsonAnySetter注釋:

class PersonDTO {

    @JsonProperty("first_name")
    private String firstName;

    @JsonProperty("last_name")
    private String lastName;

    private Map<String, String> extras = new HashMap<>();

    @JsonAnySetter
    public void setExtras(String name, String value) {
        this.extras.put(name, value);
    }

    // No args constructor
    // Getters
    // Setters
}

也可以看看:

如果您使用傑克遜,您可以做幾件事: -

  1. 您可以使用@JsonAnyGetter和@JsonAnySetter注釋,並將您的類創建為: -

import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;

import java.util.HashMap;
import java.util.Map;

public class PersonDTO {

    // mandatory field
    private String firstName;

    // mandatory field
    private String lastName;

    // Unknown optional fields?
    // Capture all other fields that Jackson do not match other members
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }

    // No args constructor
    // Getters
    // Setters
}
  1. 如果您不想在PersonDTO中使用未知字段,那么您可以在類級別使用注釋@JsonIgnoreProperties忽略未知屬性,例如
@JsonIgnoreProperties(ignoreUnknown = true)
public class PersonDTO { //TODO:- }
  1. ObjectMapper也可以配置為忽略未知數,例如: -
new ObjectMapper()
  .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)

暫無
暫無

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

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