web-dev-qa-db-fra.com

Scala - Ecrire un objet Json dans un fichier et le lire

J'ai une carte comme ci-dessous 

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"]}]
)

Je l'ai converti en chaîne Json puis l'ai écrit dans un fichier avec le code ci-dessous

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

Suis capable de lire la chaîne Json du fichier en utilisant 

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

Comment puis-je récupérer ma carte à partir de la chaîne Json ci-dessus?

EDIT: Je suis capable de lire la carte avec 

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

Mais ce processus prend plus de temps à mesure que la taille de la carte augmente.

15
yAsH

Essayez d’utiliser un mappeur probable plus rapide (et plus complet).

Je recommanderais d'utiliser JacksMapper qui englobe l'excellent Jackson pour une utilisation plus agréable de Scala.

La sérialisation en JSON devient aussi simple que 

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

... et désérialisant

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

(modifier)

Vous pouvez aussi écrire et lire des one-liners simples en utilisant FileUtils de commons-io doing

val json = FileUtils readFileToString (file, encoding)

et

FileUtils write (file, json, encoding) 
8
Bruno Grieder

En fait, j’ai eu beaucoup plus d’utilisation de json4s . La documentation est beaucoup plus claire et complète et son utilisation semble légèrement plus facile.

Une opération similaire à celle que vous demandez ressemble à ceci

import org.json4s.native.JsonFormats.parse

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