Zmieniam bibliotekę JSON z org.json na Jackson i chcę przeprowadzić migrację następującego kodu:
JSONObject datasets = readJSON(new URL(DATASETS));
JSONArray datasetArray = datasets.getJSONArray("datasets");
Teraz w Jackson mam:
ObjectMapper m = new ObjectMapper();
JsonNode datasets = m.readTree(new URL(DATASETS));
ArrayNode datasetArray = (ArrayNode)datasets.get("datasets");
Jednak nie podoba mi się tam obsada, czy jest taka możliwość ClassCastException
? Czy istnieje metoda równoważna getJSONArray
in, org.json
aby mieć właściwą obsługę błędów w przypadku, gdy nie jest to tablica?
FAIL_ON_UNKNOWN_PROPERTIES
aby po prostu uzyskać wartości null zwracane w nieużywanych polach. Ale to oczywiście tylko opcja, jeśli zestaw nazw pól jest stosunkowo ograniczony.Odpowiedzi:
Tak, projekt parsera ręcznego Jacksona różni się od innych bibliotek. W szczególności zauważysz, że
JsonNode
ma większość funkcji, które zwykle kojarzysz z węzłami tablic z innych interfejsów API. W związku z tym nie musisz przesyłać do pliku,ArrayNode
aby go użyć. Oto przykład:JSON:
Kod:
Wynik:
Zwróć uwagę na użycie
isArray
do sprawdzenia, czy węzeł jest w rzeczywistości tablicą przed iteracją. Sprawdzenie nie jest konieczne, jeśli masz absolutną pewność co do struktury danych, ale jest dostępne, jeśli tego potrzebujesz (i nie różni się to od większości innych bibliotek JSON).źródło
W Javie 8 możesz to zrobić tak:
źródło
To zależy od twojego wkładu; czyli rzeczy, które pobierasz z adresu URL. Jeśli wartością atrybutu „datasets” jest tablica asocjacyjna, a nie zwykła tablica, otrzymasz rozszerzenie
ClassCastException
.Ale z drugiej strony, poprawność starej wersji zależy również od danych wejściowych. W sytuacji, gdy twoja nowa wersja wyrzuca a
ClassCastException
, wyrzuci stara wersjaJSONException
. Źródła: http://www.json.org/javadoc/org/json/JSONObject.html#getJSONArray(java.lang.String)źródło
Zakładam, że na koniec dnia chcesz wykorzystać dane w ArrayNode, wykonując iterację. Za to:
lub jeśli lubisz strumienie i funkcje lambda:
źródło