2015-06-17 8 views
5

Ho uno schema JSON e una stringa JSON che corrisponde allo schema, tranne che potrebbe avere alcuni campi aggiuntivi. Jackson farà un'eccezione se quei campi ci sono se non aggiungo objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);. C'è un modo per ottenere una collezione di quei campi aggiuntivi per registrarli, anche se lancio un'eccezione?Ottenere l'elenco dei campi sconosciuti da Jackson

Ecco il bit rilevante del codice:

public boolean validate(Message<String> json) { 
    List<String> errorList = jsonSchema.validate(json.getPayload()); 
    ObjectMapper mapper = new ObjectMapper(); 
    try { 
     Update update = mapper.readValue(json.getPayload(), Update.class); 
    } catch (IOException e) { 
     System.out.println("Broken"); 
    } 
    if(!errorList.isEmpty()) { 
     LOG.warn("Json message did not match schema: {}", errorList); 
    } 
    return true; 
} 

risposta

6

Io non credo che ci sia una tale opzione, fuori dalla scatola.

Si potrebbe comunque mantenere questi campi unkwown con @JsonAnyGetter e @JsonAnySetter in una mappa (HashMap, Treemap) come esemplificato in this article e this one.

Aggiungi questo alla classe Update:

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

    @JsonAnyGetter 
    public Map<String, String> any() { 
    return other; 
    } 

@JsonAnySetter 
    public void set(String name, String value) { 
    other.put(name, value); 
    } 

e si può generare un'eccezione da soli se la lista campi extra non è vuoto. Il metodo per verificare che:

public boolean hasUnknowProperties() { 
    return !other.isEmpty(); 
    } 
+0

Il problema è che la classe Aggiorna viene generata automaticamente, quindi tutto ciò che aggiungo ad esso verrà cancellato. Altre idee? – Tavo

+2

@Tavo Estendere la classe di aggiornamento. –

2

Se si vuole semplicemente sapere ciò che il primo sconosciuto proprietà (nome) è, penso che l'eccezione che si ottiene ha riferimento a tale nome della proprietà. Non sarà possibile ottenere ulteriori informazioni da quando l'elaborazione si interrompe alla prima proprietà sconosciuta (o, se si ignora, quel valore viene saltato).

L'uso di @JsonAnySetter che è stato suggerito è una buona opzione.