我有一张如下地图
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]]
但是,随着地图大小的增加,这个过程需要更多的时间。
答案 0 :(得分:9)
尝试使用速度更快(更彻底)的映射器。
我建议使用JacksMapper包装优秀的Jackson以获得更加愉快的Scala用法。
序列化为JSON变得像
一样简单val json = JacksMapper.writeValueAsString[MyClass](instance)
...和反序列化
val obj = JacksMapper.readValue[MyClass](json)
(编辑)
您还可以使用FileUtils from commons-io执行
来编写和阅读简单的单行内容val json = FileUtils readFileToString (file, encoding)
和
FileUtils write (file, json, encoding)
答案 1 :(得分:2)
我实际上从json4s获得了更多用途。文档更加清晰和全面,使用起来似乎更容易。
与您请求的操作类似的操作将如下所示
import org.json4s.native.JsonFormats.parse
... get your json string ...
val parsedJson = parse(json)
val extractedJson = parsedJson.extract[MyClass]
答案 2 :(得分:0)
ujson是读写JSON的最佳现代解决方案。
以下是建立对象并将其写入磁盘的方法:
val weirdData = ujson.Obj(
"something1" -> ujson.Arr("cat1", "hash1", 101),
"something2" -> ujson.Arr("cat2", "hash2", 102),
"something3" -> ujson.Arr("cat3", "hash3", 103)
)
os.write(os.pwd/"tmp"/"weird_data.json", weirdData)
以下是weird_data.json
文件的内容:
{
"something1":["cat1","hash1",101],
"something2":["cat2","hash2",102],
"something3":["cat3","hash3",103]
}
您可以轻松地将此数据从JSON文件读取到ujson对象。
val jsonString = os.read(os.pwd/"tmp"/"weird_data.json")
val data = ujson.read(jsonString)
// here's what data contains
ujson.Value.Value = Obj(
LinkedHashMap(
"something1" -> Arr(ArrayBuffer(Str("cat1"), Str("hash1"), Num(101.0))),
"something2" -> Arr(ArrayBuffer(Str("cat2"), Str("hash2"), Num(102.0))),
"something3" -> Arr(ArrayBuffer(Str("cat3"), Str("hash3"), Num(103.0)))
)
)
这是从ujson对象获取值的方法。
data("something2")(1).str // "hash2"
有关使用Scala编写JSON数据的更多详细信息,请参见here。