2015-06-17 17 views
5

Mam schemat JSON i ciąg json, który pasuje do schematu, ale może zawierać kilka dodatkowych pól. Jackson rzuci wyjątek, jeśli te pola istnieją, jeśli nie dodaję objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);. Czy istnieje sposób na uzyskanie kolekcji tych dodatkowych pól do ich zalogowania, nawet jeśli wyrzucę wyjątek?Wyświetl listę nieznanych pól z Jackson

Oto odpowiedni kawałek kodu:

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; 
} 

Odpowiedz

6

Nie sądzę, nie ma takiej opcji po wyjęciu z pudełka.

Można jednak zachować te unkwown Pola @JsonAnyGetter i @JsonAnySetter na mapie (HashMap, TreeMap) jak wskazano w this article i this one.

Dodaj to do swojej klasy 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); 
    } 

I można sobie wyjątek jeśli lista dodatkowych pól nie jest pusta. Sposób na sprawdzenie, czy:

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

Problem polega na tym, że klasa Update jest generowana automatycznie, więc wszystko, co dodaję, zostanie wymazane. Jakieś inne pomysły? – Tavo

+2

@ Tavo Rozszerz klasę aktualizacji. –

2

Jeśli po prostu chcesz wiedzieć, co pierwszy nieznany własności (nazwa) jest, myślę, że wyjątek dostać ma odniesienie do tej nazwy właściwości. Nie będzie można uzyskać więcej informacji, ponieważ przetwarzanie zatrzymuje się przy pierwszej nieznanej właściwości (lub, jeśli ignorowanie, ta wartość jest pomijana).

Korzystanie z sugerowanego @JsonAnySetter jest dobrym rozwiązaniem.

Powiązane problemy