2013-04-08 17 views
5

Widzę funkcję parsera Jackson JSON jako nieodłącznego problemu w mojej sprawie. Mam parsować nieznany plik, który może nie być zgodny z formatami json, a tym samym mieć wiele nazw kluczy, które są takie same. W takim przypadku, jeśli wywołasz na nim funkcję, taką jak getFieldNames(), kończy się ona dając tylko jedną pozycję spośród wielu tych samych prostych elementów. Więc jeśli zrobię get (String) na nim, otrzymam tylko jeden z tych Json węzłów o tej samej wartości klucza, gdzie powinienem dostać wszystkie pozostałe Jakieś uwagi lub rozwiązania w tej sprawie?Obsługa parsera Jacksona nazw wielu pól o tej samej nazwie

Odpowiedz

4

Większość analizatorów składni JSON odrzuci plik wejściowy od ręki, ponieważ duplikaty kluczy na tym samym poziomie zagnieżdżenia są niedozwolone (jest to standard de facto). Jednak niektóre parsery pozwalają na obsługę duplikatu na różne sposoby.

Jednym ze sposobów radzenia sobie z tym w Jackson, byłoby odwzorowanie zwykłych atrybutów na klasę jednostek, a następnie obsłużenie potencjalnych duplikatów za pomocą @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); 
    } 
} 

Uwaga użycie multimapy: regularne mapy hash nie może zawierać duplikatów kluczy, więc multimap jest wymogiem dla roztworu roboczego. Po deserializacji pliku wejściowego wszystkie "zwykłe" atrybuty JSON zostaną odwzorowane na odpowiadające im właściwości obiektu, podczas gdy wszystkie duplikaty będą przechowywane na mapie i dostępne do ręcznego przetwarzania.

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

Alternatywnie, można utworzyć niestandardową Deserializator, który będzie otrzymywać wszystkie żetony (niezależnie od wether są duplikaty lub nie).

+0

Co jeśli chciałbym, aby deserializator wygenerował błąd, jeśli zamiast tego znajdzie duplikat? – 2rs2ts

+0

@ 2rs2ts - domyślne zachowanie deserializera polega na wyrzuceniu błędu w obliczu zduplikowanych błędów. Jeśli tego właśnie chcesz się spodziewać, nie potrzebujesz rozwiązania w tej odpowiedzi. – Perception

+0

Dzięki. Byłem zdezorientowany tym, który deserializator przeszedł mój JSON w moim kodzie, więc domyślam się, że moje postrzeganie, że nie było to domyślne zachowanie, było błędne :) ale dobrze jest o tym wiedzieć. – 2rs2ts

Powiązane problemy