2013-05-28 8 views
59

ich meine JSON-Bibliothek von org.json nach Jackson zu ändern und ich möchte den folgenden Code migrieren:Jackson, wie JsonNode zu ArrayNode ohne Casting zu transformieren?

JSONObject datasets = readJSON(new URL(DATASETS)); 
JSONArray datasetArray = datasets.getJSONArray("datasets"); 

Jetzt in Jackson ich folgendes haben:

ObjectMapper m = new ObjectMapper(); 
JsonNode datasets = m.readTree(new URL(DATASETS));  
ArrayNode datasetArray = (ArrayNode)datasets.get("datasets"); 

aber ich weiß nicht Wie die Besetzung dort, gibt es die Möglichkeit für eine ClassCastException? Gibt es eine Methode, die getJSONArray in org.json entspricht, so dass ich richtige Fehlerbehandlung habe, falls es kein Array ist?

+0

Leider kann ich das vollständige Mapping nicht verwenden, da die Daten keine Feldnamen fixieren. –

+1

Wenn die Feldnamen aus einer begrenzten Menge stammen, möchten Sie möglicherweise eine Klasse definieren, die alle davon enthält, und die Funktion "FAIL_ON_UNKNOWN_PROPERTIES" des Deserializers verwenden, um Nullen in den nicht verwendeten Feldern zu erhalten. Aber das ist natürlich nur eine Option, wenn der Feldname relativ begrenzt ist. – fvu

+0

Hm Ich denke, dass diese Lösung nicht in meinem Fall am besten passt, aber ich werde mich daran erinnern, falls ich ein Problem mit einem begrenzten Satz habe, der im Voraus bekannt ist! –

Antwort

146

Ja, das Jackson-Handbuch Parser-Design unterscheidet sich ziemlich von anderen Bibliotheken. Insbesondere werden Sie feststellen, dass die meisten Funktionen aufweist, die Sie normalerweise Array-Knoten anderer APIs zuordnen würden. Daher müssen Sie nicht zu einem ArrayNode zu verwenden, um zu verwenden. Hier ein Beispiel:

JSON:

{ 
    "objects" : ["One", "Two", "Three"] 
} 

Code:

final String json = "{\"objects\" : [\"One\", \"Two\", \"Three\"]}"; 

final JsonNode arrNode = new ObjectMapper().readTree(json).get("objects"); 
if (arrNode.isArray()) { 
    for (final JsonNode objNode : arrNode) { 
     System.out.println(objNode); 
    } 
} 

Ausgang:

" Ein“
"Two"
"Three"

Beachten Sie die Verwendung von isArray zu überprüfen, ob der Knoten tatsächlich ein Array vor laufen. Die Überprüfung ist nicht notwendig, wenn Sie absolut sicher in Ihrer Datenstruktur sind, aber es ist verfügbar, wenn Sie es brauchen (und das ist nicht anders als die meisten anderen JSON-Bibliotheken).

+1

Du hast mir Stunden gespart. Vielen Dank! –

1

Gibt es eine Methode, die getJSONArray in org.json entspricht, so dass ich richtige Fehlerbehandlung habe, falls es kein Array ist?

Es hängt von Ihrer Eingabe ab; d. h. das Material, das Sie von der URL abrufen. Wenn der Wert des Attributs "Datasets" ein assoziatives Array und kein einfaches Array ist, erhalten Sie eine ClassCastException.

Aber wiederum hängt die Korrektheit Ihrer alten Version auch von der Eingabe ab. In der Situation, in der Ihre neue Version eine ClassCastException auslöst, wird die alte Version JSONException werfen. Referenz: http://www.json.org/javadoc/org/json/JSONObject.html#getJSONArray(java.lang.String)

+0

Ah ok, also könnte ich gerade eine ClassCastException fangen, danke!Für meinen Geschmack ist es ein bisschen weniger elegant als eine bestimmte JsonException, aber wenn nicht möglich, ist das ansonsten immer noch gut. –

Verwandte Themen