2015-05-04 9 views
6

ho la seguente struttura JSON:analisi di un array di JSON utilizzando Giocare Framework e Java

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

Sto usando il quadro Play per analizzare i dati JSON da un messaggio HTTP, che è stato inviato tramite un auto-sviluppo Servizio REST. So già come posso analizzare il nome e il cognome dai dati JSON, cercando in documentazione, questo è fatto da:

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

Ora la mia domanda è, come posso analizzare matrice "lingue" in JSON dati. Ho trovato altri post su questo problema, ma tutti usavano Scala, che non riesco a capire, quindi preferibilmente sto cercando una soluzione Java.

Ho già provato diverse cose, come ad esempio questo:

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

In base alla documentazione json.findPath() restituisce un JsonNode, su cui può essere chiamato i getElements funzione(), che sarebbe tornato un Iterator di JsonNode. Ma ottengo un errore di compilazione su getElements: "Il metodo getElements() non è definito per il tipo JsonNode"

Qualcuno sa di un modo semplice per analizzare tale array? Grazie in anticipo

risposta

11

Si potrebbe farlo in un per-ogni ciclo come questo:

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

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

Oppure, se siete in lambda:

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

anche ... il corretta modo per creare un 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(); 

si dovrebbe davvero saperne di più th Funzionalità di jackson/fasterxml. È una molto performante lib. Un buon inizio è JacksonInFiveMinutes.

+0

Thx per la punta! Andando a dare un'occhiata mentre parlo. – jensbrulmans

+0

Sono riuscito a ottenere ciò che volevo usando 'ArrayNode array = json.withArray (" fieldName ");" Grazie mille sebster! – jensbrulmans

+0

@sebster hai fatto la mia giornata. Funziona perfettamente –

1

Prova questo:

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(); 
} 

Qui sto semplicemente stampando uno degli elementi, ma si potrebbe fare quello che vuoi, naturalmente :)

Spero che questo aiuti.

+0

Il costruttore di JSONArray non sembra accettare un oggetto di tipo "JsonNode" sfortunatamente. _ "JSONException: il valore iniziale di JSONArray dovrebbe essere una stringa o una raccolta o un array." _ – jensbrulmans

+0

Davvero? È un po 'strano. Ho modificato la mia risposta per provare e dare un'altra opzione. Non penso di avere nessun altro modo in mente se questo non funziona. C'è una ragione per cui stai usando Play Framework in modo specifico o potresti provare un altro parse? Se è così, raccomando Gson o qualcosa del genere, è molto più Java-friendly (ed è molto più documentato con esempi Java :)) –

+0

@OriLentz: Non intendi il nodo 'ArrayNode arr = (ArrayNode);'? – ccheneson