Tengo el siguiente objeto JSON
{
"donor": "Y",
"bloodType": null,
"eligibility": {
"categoryEligible": false,
"suspensionEligible": false,
"paidFinesEligible": false,
"pointSystemEligible": false,
"failedDocuments": [
{
"type": "SOMETHING",
"reason": "SOMETHING_ELSE"
}
],
"eligible": false,
}
}
Estoy usando Jackson para convertirlo en mi objeto de dominio. Estos son los campos que estoy usando:
private String donor;
@JsonProperty("eligibility")
private Eligibility eligibility;
La clase Elegibilidad contiene todos estos campos, quiero en lugar de tener campos individuales para todos los valores booleanos, al tener un solo mapa <String, Bolean> donde cadena es el nombre de la propiedad y el valor booleano es.
@JsonProperty("failedDocuments")
private List<FailedDocumentsItem> failedDocuments;
@JsonProperty("eligible")
private boolean eligible;
@JsonProperty("donor")
private boolean donor;
Añadir un @JsonAnySetter
campo (Jackson 2.8+) o el método:
Anotación de marcador que se puede utilizar para definir una "cualquier setter" mutador lógico - ya sea usando método no estático de dos argumentos (primera nombre de argumento de la propiedad, segundo valor al conjunto) o en un campo (de tipo
Map
o POJO) - para ser usado como un controlador de "fallback" para todas las propiedades de otro modo no reconocidos encontró a partir del contenido JSON.
Ejemplo de uso de campos públicos por razones de brevedad.
public class Test {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
Root root = mapper.readValue(new File("test.json"), Root.class);
System.out.println("donor = " + root.donor);
System.out.println("flags = " + root.eligibility.flags);
System.out.println("failedDocuments = " + root.eligibility.failedDocuments);
}
}
class Root {
public Boolean realId;
public String donor;
public Boolean bloodType;
public Boolean selectiveServiceCandidate;
public Eligibility eligibility;
}
class Eligibility {
@JsonAnySetter
public Map<String, Boolean> flags = new HashMap<>();
public List<FailedDocument> failedDocuments;
}
class FailedDocument {
public String type;
public String reason;
@Override
public String toString() {
return "FailedDocument[type=" + this.type + ", reason=" + this.reason + "]";
}
}
Salida
donor = Y
flags = {paidFinesEligible=false, hasRealId=false, suspensionEligible=false, acaaEligible=false, eligibleIgnoreRenewalDate=false, eligibleDocuments=false, cardStatusEligible=false, expirationDateEligible=false, eligible=false, citizenEligible=false, pointSystemEligible=false, ageEligible=false, gravamenesEligible=false, categoryEligible=false, eligibleMedical=false}
failedDocuments = [FailedDocument[type=CERTIFICATE_CITIZENSHIP, reason=MISSING]]