[英]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
}
也可以看看:
如果您使用傑克遜,您可以做幾件事: -
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.