如何将JSON反序列化为一个Java类,该Java类具有已知的必填字段,但可以有几个未知字段?

如何将JSON反序列化为一个Java类,该Java类具有已知的必填字段,但可以有几个未知字段?,java,json,jackson,dropwizard,Java,Json,Jackson,Dropwizard,我有一个输入JSON,里面有我确定的字段。但是,我需要灵活地添加几个额外的字段。我不知道额外字段的名称,但我必须处理它 我正在考虑添加一个包含所有额外字段的映射字段,但是输入没有映射到这个字段中 我想在Dropwizard端点中反序列化JSON 有办法对付杰克逊吗 例如: JSON有效负载1: { "first_name": "John", "last_name": "Doe", "date_of_birth": "01/01/1990", "postcode": "1234"

我有一个输入JSON,里面有我确定的字段。但是,我需要灵活地添加几个额外的字段。我不知道额外字段的名称,但我必须处理它

我正在考虑添加一个包含所有额外字段的映射字段,但是输入没有映射到这个字段中

我想在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
}

您可以使用
jsonanystetter
注释:

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
}
class PersonDTO{
@JsonProperty(“名字”)
私有字符串名;
@JsonProperty(“姓氏”)
私有字符串lastName;
private Map extras=新HashMap();
@JSONANYSETER
公共void setExtras(字符串名称、字符串值){
此.extras.put(名称、值);
}
//无参数构造函数
//吸气剂
//二传手
}
另见:


如果使用Jackson,您可以做以下几件事:-

  • 您可以使用@JsonAnyGetter和@JsonAnySetter注释,并将类创建为:-
  • ObjectMapper还可以配置为忽略未知项,例如:-
  • 
    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
    }
    
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class PersonDTO { //TODO:- }
    
    new ObjectMapper()
      .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)