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
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).
- 1. Kilka pól wyboru o tej samej nazwie
- 2. Używanie klasy w przestrzeni nazw o tej samej nazwie?
- 3. Obsługa wielu numerów <input> o tej samej nazwie w spring-mvc
- 4. Używanie dwóch bibliotek DLL o tej samej nazwie i tej samej przestrzeni nazw
- 5. Selen - lokalizowanie wielu elementów o tej samej nazwie klasy
- 6. Zapobieganie wielu instancjom na serwerze o tej samej nazwie użytkownika
- 7. C++ Wielu rodziców o tej samej nazwie zmiennej
- 8. Funkcja i zmienna o tej samej nazwie
- 9. Metoda nadpisywania Jython o tej samej nazwie
- 10. Android Gradle moduły o tej samej nazwie
- 11. PHP nieaktualne: Metody o tej samej nazwie
- 12. Typedef i enum o tej samej nazwie?
- 13. Excel.Workbook.SaveAs (...) z plikiem o tej samej nazwie
- 14. Ukrywanie wszystkich elementów o tej samej nazwie klasy?
- 15. Jak rozwiązać dwie struktury o tej samej nazwie?
- 16. Elementy formularza o tej samej nazwie odzwierciedlone w DOM
- 17. Kontrolery rspec iz nazw z tej samej nazwie
- 18. Wiele grup przycisków radiowych o tej samej nazwie
- 19. Usuwanie plików cookie o tej samej nazwie, ale różnych ścieżkach.
- 20. dwie funkcje o tej samej nazwie w R
- 21. Jak mogę załadować dwa zadania zadawania o tej samej nazwie?
- 22. Scal kolumny w ramach DataFrame o tej samej nazwie
- 23. Jak wybrać zmienne (bez tekstu) o tej samej nazwie?
- 24. Funkcja i struktura o tej samej nazwie w C++
- 25. Wykrywanie liczby uruchomionych procesów o tej samej nazwie
- 26. Dziedziczona klasa C++ ma członka o tej samej nazwie
- 27. framework entity 4.1 dwie tabele o tej samej nazwie właściwości
- 28. Zmienna instancji java i metoda o tej samej nazwie
- 29. SVN: wersjonowany katalog o tej samej nazwie już istnieje
- 30. Zignoruj wszystkie pliki o tej samej nazwie w git
Co jeśli chciałbym, aby deserializator wygenerował błąd, jeśli zamiast tego znajdzie duplikat? – 2rs2ts
@ 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
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