18

我有一张像下面这样的地图

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]]

但是,随着地图大小的增加,此过程需要更多时间。

4

3 回答 3

13

尝试使用可能更快(更彻底)的映射器。

我会推荐使用JacksMapper,它包装了优秀的Jackson以获得更愉快的 Scala 使用。

序列化为 JSON 变得如此简单

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

...和反序列化

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

(编辑)

您还可以使用commons-io 中的 FileUtils编写和读取简单的单行代码

val json = FileUtils readFileToString (file, encoding)

FileUtils write (file, json, encoding) 
于 2013-07-08T09:05:13.537 回答
5

实际上,我从json4s得到了更多用途。文档更加清晰和全面,使用起来也稍微容易一些。

与您请求的操作类似的操作如下所示

import org.json4s.native.JsonFormats.parse

... get your json string ...
val parsedJson = parse(json)
val extractedJson = parsedJson.extract[MyClass]
于 2015-10-22T23:11:33.770 回答
3

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 数据的更多详细信息,请参阅此处。

于 2020-12-17T18:40:35.207 回答