Ich ändere meine JSON-Bibliothek von org.json auf Jackson und möchte den folgenden Code migrieren:
JSONObject datasets = readJSON(new URL(DATASETS));
JSONArray datasetArray = datasets.getJSONArray("datasets");
Jetzt in Jackson habe ich folgendes:
ObjectMapper m = new ObjectMapper();
JsonNode datasets = m.readTree(new URL(DATASETS));
ArrayNode datasetArray = (ArrayNode)datasets.get("datasets");
Allerdings mag ich die Besetzung dort nicht, gibt es die Möglichkeit für eine ClassCastException
? Gibt es eine Methode entspricht getJSONArray
in org.json
so , dass ich die richtige Fehlerbehandlung im Fall , dass es kein Array?
FAIL_ON_UNKNOWN_PROPERTIES
um nur Nullen in den nicht verwendeten Feldern zurückzugeben. Dies ist natürlich nur dann eine Option, wenn der festgelegte Feldname relativ begrenzt ist.Antworten:
Ja, das manuelle Parser-Design von Jackson unterscheidet sich erheblich von anderen Bibliotheken. Insbesondere werden Sie feststellen, dass
JsonNode
die meisten Funktionen vorhanden sind, die Sie normalerweise mit Array-Knoten anderer APIs verknüpfen würden. Als solches müssen Sie nicht in ein Casting umwandeln, um esArrayNode
zu verwenden. Hier ist ein Beispiel:JSON:
Code:
Ausgabe:
Beachten Sie die Verwendung von
isArray
, um zu überprüfen, ob der Knoten tatsächlich ein Array ist, bevor Sie iterieren. Die Überprüfung ist nicht erforderlich, wenn Sie absolut sicher sind, dass Ihre Datenstruktur vorhanden ist. Sie ist jedoch verfügbar, falls Sie sie benötigen (und dies unterscheidet sich nicht von den meisten anderen JSON-Bibliotheken).quelle
In Java 8 können Sie dies folgendermaßen tun:
quelle
Es hängt von Ihrer Eingabe ab; dh das Zeug, das Sie von der URL abrufen. Wenn der Wert des Attributs "Datasets" eher ein assoziatives Array als ein einfaches Array ist, erhalten Sie ein
ClassCastException
.Andererseits hängt die Richtigkeit Ihrer alten Version auch von der Eingabe ab. In der Situation, in der Ihre neue Version a wirft
ClassCastException
, wird die alte Version werfenJSONException
. Referenz: http://www.json.org/javadoc/org/json/JSONObject.html#getJSONArray(java.lang.String)quelle
Ich würde am Ende des Tages davon ausgehen, dass Sie die Daten im ArrayNode durch Iteration verbrauchen möchten. Dafür:
oder wenn Sie sich für Streams und Lambda-Funktionen interessieren:
quelle