2013-04-08 7 views
5

Vedo una caratteristica del parser Jackson JSON come un problema inerente al mio caso. Sto analizzando un file sconosciuto che potrebbe non essere conforme ai formati JSON, quindi finirà per avere più nomi di chiavi uguali. In tal caso, se io chiamo una funzione come getFieldNames() su di esso, si finisce per dare solo una voce tra quelli più stessi semplici elementi. Quindi se faccio un get (String) su di esso, finirò per ottenere solo uno di quei nodi Json che hanno lo stesso valore chiave dove dovrei ottenere tutti gli altri Eventuali commenti o soluzioni su questo?Gestione parser Jackson di nomi di più campi con lo stesso nome

risposta

4

La maggior parte dei parser JSON rifiuterà il file di input in modo anomalo, poiché non sono consentite chiavi duplicate allo stesso livello di nidificazione (questo è uno standard de facto). Tuttavia, alcuni parser ti permetteranno di gestire il duplicato in vari modi.

Un modo per gestire questo in Jackson, sarebbe quello di mappare gli attributi regolari in una classe di entità, quindi gestire i potenziali duplicati tramite un @JsonAnySetter.

public class Bag { 
    final transient Multimap<String, Object> multimap = LinkedListMultimap 
      .create(); 

    // regular properties, constructors etc 

    @JsonAnySetter 
    public void add(final String key, final String value) { 
     multimap.put(key, value); 
    } 
} 

Nota l'uso di un multimap: mappe regolari hash non possono contenere chiavi duplicate, quindi un multimap è un requisito per una soluzione di lavoro. Dopo aver deserializzato il file di input, tutti gli attributi JSON 'regolari' verranno mappati alle proprietà corrispondenti dell'entità, mentre tutti i duplicati verranno memorizzati nella mappa e disponibili per l'elaborazione manuale.

final List<Object> duplicatedValues = multimap.get(someKey); 

In alternativa, è possibile creare un deserializzatore personalizzato, che sarà ricevilo tutti i gettoni (a prescindere che scendessimo sono duplicati o meno).

+0

E se volessi che il deserializzatore lanci un errore se invece trova un attributo duplicato? – 2rs2ts

+0

@ 2rs2ts - il lancio di un errore di fronte a errori duplicati è il comportamento predefinito del deserializzatore. Se questo è ciò che stai cercando di accadere, allora non hai bisogno della soluzione in questa risposta. – Perception

+0

Grazie. Ero confuso su quale deserializzatore il mio JSON stava attraversando nel mio codice, quindi credo che la mia percezione che non fosse il comportamento predefinito era sbagliata :) ma è comunque bello saperlo. – 2rs2ts

Problemi correlati