问题
I have an input JSON which has fields what I sure inside. But, I need a flexibility to add several extra fields. I don't know the name of the extra fields, but I have to handle it.
I was thinking adding a MaP field which contains all of extra fields, but the inputs are not mapped into this field.
I want to deserialize the JSON in a Dropwizard endpoint.
Is there a way to do with Jackson?
Example:
JSON payload 1:
{
"first_name": "John",
"last_name": "Doe",
"date_of_birth": "01/01/1990",
"postcode": "1234"
}
JSON payload 2:
{
"first_name": "Alice",
"last_name": "Havee",
"phone_no": 012345678,
"passport_no": "AB 123456"
}
Later on JSON payload 3 can have even different fields.
Java DTO:
public class PersonDTO {
// mandatory field
private String firstName;
// mandatory field
private String lastName;
// Unknown optional fields?
// No args constructor
// Getters
// Setters
}
回答1:
You can use JsonAnySetter
annotation:
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
}
See also:
- JSON Jackson deserialization multiple keys into same field
- Adding a dynamic json property as java pojo for jackson
- How to use dynamic property names for a Json object
回答2:
There are couple of things that you can do if you are using Jackson:-
- You can make use of @JsonAnyGetter and @JsonAnySetter annotation and create your class as:-
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
}
- If you don't want the unknown fields in your PersonDTO then you can simply ignore unknown properties using annotation @JsonIgnoreProperties at class level eg
@JsonIgnoreProperties(ignoreUnknown = true)
public class PersonDTO { //TODO:- }
- The ObjectMapper can also be configured to ignore unknowns e.g.:-
new ObjectMapper()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
来源:https://stackoverflow.com/questions/57081709/how-can-i-deserialize-a-json-to-a-java-class-which-has-known-mandatory-fields-b