2015-12-17 7 views
14

ho bisogno di caricare un file JSON con un elenco di città in uno dei miei controllori, al fine di passare ad una vista dopo.Come caricare file di JSON utilizzando Play with Scala

ho messo il file qui: app/assets/jsons/countriesToCities.json
(A proposito: è questa una posizione appropriata, o dovrei metterlo da qualche altra parte?)

Ho letto le documentazione e posso vederlo è possibile creare un da una stringa: https://www.playframework.com/documentation/2.4.x/ScalaJson#Using-string-parsing

Desidero creare un JsValue in modo simile. La differenza è che voglio caricare il contenuto da un file , non da una stringa ... Purtroppo non ho trovato nessuno snippet di codice su come farlo.
Devo usare qualcos'altro per leggere il file in una stringa e solo allora usare il metodo parse su quella stringa?

I snippet di codice con esempi su come eseguire questa operazione nelle risposte saranno molto apprezzati! :)

Grazie mille in anticipo!

+0

Eventuali duplicati di [come leggere un file dal server in gioco framewor k] (http://stackoverflow.com/questions/4519828/how-to-read-a-file-from-server-in-play-framework) – Rumoku

+1

Non proprio un duplicato @ Mr.V. . Ma insieme alla risposta di Dylan, penso che riuscirò a risolverlo! Grazie! –

risposta

10

Ecco come sono riuscito a risolverlo:

val source: String = Source.fromFile("app/assets/jsons/countriesToCities.json").getLines.mkString 
val json: JsValue = Json.parse(source) 

Grazie per l'aiuto! :)

+2

'Json.parse' può leggere direttamente da uno stream, quindi è meglio usare la versione' InputStream' piuttosto che ottenere le linee, estrarne una stringa e poi analizzarla. – BeepDog

+0

Il '.getLines' non è necessario qui. Inoltre, sarebbe meglio chiudere il risultato della chiamata 'fromFile' (un'istanza' io.Source'). – acros

14

Sembra che il commento sull'eventuale duplicato sia come leggere un file dalla cartella dell'app/asset. La mia risposta è su come analizzare Json da un flusso. Combina i due e dovresti essere a posto.

Json.parse accetta alcuni tipi di argomenti diversi, uno dei quali è InputStream.

val stream = new FileInputStream(file) 
val json = try { Json.parse(stream) } finally { stream.close() } 

P.S. Quando non riesci a trovare ciò che stai cercando nei documenti scritti, lo API Docs è un buon punto di partenza.

+0

'FileInputStream' appartiene a' java.io', ma sto usando Scala + Play, non Java + Play. Devo davvero usare il 'java.io', o c'è un altro modo? –

+1

La risposta breve è no. Risposta lunga: Scala non ha molte funzionalità integrate per IO. L'oggetto 'scala.io.Source' è la tua scommessa più vicina - puoi usarlo per caricare un file in una stringa, quindi passare quella stringa a' Json.parse'.Si potrebbe anche cercare in altre librerie con soluzioni IO, ma ciò sembra troppo impegnativo per sostituire due linee di codice. – Dylan

+4

Devo notare che poiché stai usando Scala + Play, stai usando davvero Scala + Java + Play. Puoi ancora usare 'java.io' senza perdere Scala. – Dylan