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
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).
- 1. jQuery Convalida più campi con lo stesso nome
- 2. Impostare più di un'intestazione HTTP con lo stesso nome?
- 3. Più moduli con campi di input con lo stesso nome Attributo? Bene o male?
- 4. Utilizzo di due DLL con lo stesso nome e lo stesso spazio dei nomi
- 5. Pacchetti con lo stesso nome di funzione
- 6. Spazio dei nomi con lo stesso nome di un nome di classe
- 7. SQL unire, ottenendo più colonne con lo stesso nome
- 8. con lo stesso nome di una macro
- 9. Gestione di più endpoint WCF per lo stesso servizio
- 10. Namespace e classe con lo stesso nome?
- 11. Stesso nome per campi modulo e campi tabella database?
- 12. Automake e file con lo stesso nome
- 13. È OK avere più moduli HTML con lo stesso nome?
- 14. Clojure let consente più associazioni con lo stesso nome
- 15. Importazione di due classi con lo stesso nome. Come gestire?
- 16. PHP/MySQL: ottenere più colonne con lo stesso nome nella query di join senza alias?
- 17. MySQL Seleziona, colonna con lo stesso nome da più tabelle, ordina per un'altra colonna con lo stesso nome
- 18. XMLNode con più valori e lo stesso nome
- 19. Come evitare conflitti di nomi per due valori di enumerazione con lo stesso nome in C++?
- 20. Macro e funzione con lo stesso nome
- 21. Aggiunta di più risorse con lo stesso nome a Xcode per iPhone
- 22. Funzioni multiple con lo stesso nome
- 23. vedere Metodo di modulo con lo stesso nome della classe
- 24. PHP obsolete: metodi con lo stesso nome
- 25. parametri denominati con lo stesso nome
- 26. Come evitare di utilizzare lo stesso identificatore per nomi di classi e nomi di proprietà?
- 27. Utilizzo di una classe in uno spazio dei nomi con lo stesso nome?
- 28. Differenziazione tra 2 nomi di colonne SQL con lo stesso nome in C# SqlConnection
- 29. Metodo di sovrascrittura Jython con lo stesso nome
- 30. moduli Gradle Android con lo stesso nome
E se volessi che il deserializzatore lanci un errore se invece trova un attributo duplicato? – 2rs2ts
@ 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
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