2013-07-08 11 views
15

ho una mappa come qui di seguitoScala - Scrittura oggetto JSON su file e leggerlo

val map : scala.collection.mutable.Map[String,Any] = Map(
    dummy1 -> ["cat1", "hash1", 101, 1373269076, {"1" : ["dummy", "dummy", "dummy"]}], 
    dummy2 -> ["cat1", "hash1", 102, 1373269076, {"2" : ["dummy", "dummy", "dummy"]}], 
    dummy3 -> ["cat1", "hash1", 103, 1373269076, {"3" : ["dummy", "dummy", "dummy"]}] 
) 

ho convertito in una stringa JSON e poi scritto in un file con il codice qui sotto

Some(new PrintWriter("foo.txt")).foreach{p => 
    p.write(JSONObject(map.toMap).toString()); p.close 
} 

sono in grado di leggere la stringa JSON dal file utilizzando

val json_string = scala.io.Source.fromFile("foo.txt").getLines.mkString 

Come faccio ad avere la mia mappa indietro dalla stringa JSON di cui sopra?

EDIT: sono in grado di leggere la mappa con

val map1 = JSON.parseFull(json_string).get.asInstanceOf[Map[String,Any]] 

Ma, questo processo sta prendendo più tempo come la dimensione della mappa aumenta.

+1

da 'più time', vuoi dire O (n) o qualcosa di peggio? Se peggio, considera l'espansione del tuo heap. –

risposta

8

Provare a utilizzare un mapper probabilmente più veloce (e più completo).

Si consiglia di utilizzare JacksMapper che avvolge l'eccellente Jackson per un utilizzo Scala più piacevole.

serializzazione a JSON diventa semplice come

val json = JacksMapper.writeValueAsString[MyClass](instance) 

... e deserializzazione

val obj = JacksMapper.readValue[MyClass](json) 

(edit)

È possibile effettuare anche la scrittura e la lettura di semplici battute utilizzando FileUtils from commons-io

val json = FileUtils readFileToString (file, encoding) 

e

FileUtils write (file, json, encoding) 
+0

quale versione di Scala supporta? – yAsH

+0

Dalla prima pagina 'Questa versione di jack è stata testata con Scala 2.9.3, 2.10.2 e Jackson 2.2.2' –

+0

Sto usando Scala 2.9.3-RC2. Sto ottenendo l'errore jacks_2.10-2.2.2.jar è cross-compilato con una versione incompatibile di Scala (2.10) subito dopo aver aggiunto il file jar al progetto. – yAsH

1

effetti, ho fatto molto di più l'uso da json4s. La documentazione è molto più chiara e completa e l'utilizzo sembra leggermente più semplice.

Un'operazione simile a quella che si richiede sarebbe simile a questa

import org.json4s.native.JsonFormats.parse 

... get your json string ... 
val parsedJson = parse(json) 
val extractedJson = parsedJson.extract[MyClass]