2015-05-04 11 views
6

Ich habe folgende Json Struktur:Parsing einen JSON-Array mit Play-Framework und Java

{ 
    "name": "John", 
    "surname": "Doe", 
    "languages": [ 
    {"language": "english", "level": "3"}, 
    {"language": "french", "level": "1"} 
    ] 
} 

ich die Play-Framework verwenden Json Daten aus einer HTTP-Nachricht zu analysieren, die unter Verwendung eines selbst entwickelte gesendet wurden REST-Service.

JsonNode json = request().body().asJson(); 
String name = json.findPath("name").textValue(); 
String surname = json.findPath("surname").textValue(); 

Nun meine Frage ist, wie kann ich die Array „Sprachen“ in der Json analysieren: Ich weiß schon, wie ich durch einen Blick auf der Dokumentation die Namen und Nachnamen aus den JSON-Daten analysieren kann, wird dies durch getan Daten. Ich habe einige andere Posts zu diesem Problem gefunden, aber sie alle benutzen Scala, was ich nicht verstehen kann, also suche ich am liebsten nach einer Java-Lösung.

Ich habe bereits versucht, einige Dinge, wie zum Beispiel dieses:

List<JsonNode> languages = json.findPath("languages").getElements(); 

Gemäß der Dokumentation json.findPath() gibt einen JsonNode, auf das die Funktion GetElements aufgerufen werden kann(), die zurückkehrt ein Iterator von JsonNode. Aber ich bekomme einen Kompilierfehler bei getElements: "Die Methode getElements() ist nicht definiert für den Typ JsonNode"

Wer weiß von einer einfachen Möglichkeit, ein solches Array zu parsen? Vielen Dank im Voraus

Antwort

11

Sie könnten es tun, in eine für-jede Schleife wie folgt aus:

JsonNode json = request().body().asJson(); 

for (JsonNode language : json.withArray("languages")) { 
    Logger.info("language -> " + language.get("someField").asText()); 
    //do something else 
} 

Oder, wenn Sie in lambdas sind:

json.withArray("languages").forEach(language -> Logger.info("language -> " + language)); 

Auch ... die richtige Weg schaffen eine ArrayNode:

//using a mapper(important subject the mapper is) 
ObjectMapper mapper = new ObjectMapper(); 
ArrayNode array = mapper.createArrayNode(); 

//using an existing ArrayNode from a JsonNode 
ArrayNode array = json.withArray("fieldName"); 

//or using Play's Json helper class 
ArrayNode array = Json.newArray(); 

Sie wirklich mehr über th lesen sollte Die Fähigkeiten von jackson/fasterxml. Es ist ein sehr performant lib. Ein guter Anfang ist JacksonInFiveMinutes.

+0

Danke für den Tipp! Ich werde es überprüfen, während ich spreche. – jensbrulmans

+0

Ich habe erreicht, was ich wollte mit 'ArrayNode array = json.withArray (" fieldName ");' Vielen Dank Sebster! – jensbrulmans

+0

@sebster hast du meinen Tag gemacht. Funktioniert perfekt –

1

Try this:

JsonNode node = (JsonNode)json.findPath("languages"); 
ArrayNode arr = (ArrayNode)node; 
Iterator<JsonNode> it = arr.iterator(); 
while (it.hasNext()) { 
    JSONObject obj = it.next(); 
    System.out.println("language: " + obj.findPath("language").getTextValue(); 
} 

Hier einfach Drucken Ich bin eines der Elemente, aber man konnte tun, was Sie wollen natürlich :)

Hoffnung, das hilft.

+0

Der Konstruktor von JSONArray scheint leider kein Objekt vom Typ 'JsonNode' zu akzeptieren. _ "JSONException: Der JSONArray-Anfangswert sollte eine Zeichenfolge oder Sammlung oder ein Array sein." _ – jensbrulmans

+0

Wirklich? Das ist ein bisschen seltsam. Ich habe meine Antwort bearbeitet, um eine andere Option zu geben. Ich glaube nicht, dass ich anders denke, wenn das nicht funktioniert. Gibt es einen Grund, warum Sie Play Framework speziell verwenden oder können Sie vielleicht einen anderen Parser ausprobieren? Wenn dem so ist, empfehle ich Gson oder etwas ähnliches, es ist viel Java-freundlicher (und ist viel mehr mit Java-Beispielen dokumentiert :)) –

+0

@OriLentz: Meinst du nicht 'ArrayNode arr = (ArrayNode) node;'? – ccheneson