web-dev-qa-db-ja.com

Scala-Jsonオブジェクトをファイルに書き込み、読み取る

以下のような地図があります

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

私はそれをJson文字列に変換してから、以下のコードでファイルに書き込みました

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

を使用してファイルからJson文字列を読み取ることができます

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

上記のJson文字列からマップを取得するにはどうすればよいですか?

編集:で地図を読むことができます

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

ただし、マップのサイズが大きくなるほど、このプロセスには時間がかかります。

16
yAsH

おそらくより高速な(そしてより完全な)マッパーを使用してみてください。

私は JacksMapper を使用することをお勧めします Jackson より快適なScalaの使用法。

JSONへのシリアル化は次のように簡単になります

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

...そして逆シリアル化

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

(編集)

Files from Commons-io を使用して、簡単なワンライナーの書き込みと読み取りを行うこともできます

val json = FileUtils readFileToString (file, encoding)

そして

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

実際、私は json4s からより多くの利用を得ました。ドキュメントはより明確で包括的であり、使用方法は少し簡単に思われます。

あなたが要求しているものと同様の操作は次のようになります

import org.json4s.native.JsonFormats.parse

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