【问题标题】:Scala - Writing Json object to file and reading itScala - 将 Json 对象写入文件并读取它
【发布时间】:2013-07-08 07:43:49
【问题描述】:

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

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

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

【问题讨论】:

  • more time,你的意思是 O(n) 还是更糟的东西?如果更糟,请考虑扩展您的堆。
  • ujson 库是最好的现代解决方案。已接受答案中的库已存档,不再处于活动状态。详情请参阅我的回答。

标签: json scala parsing


【解决方案1】:

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

我建议使用 JacksMapper,它包裹了出色的 Jackson,以获得更愉快的 Scala 使用。

序列化为 JSON 变得如此简单

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

...和反序列化

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

(编辑)

您还可以使用FileUtils from commons-iodoing 编写和阅读简单的单行代码

val json = FileUtils readFileToString (file, encoding)

和

FileUtils write (file, json, encoding) 

【讨论】:

  • 它支持哪个 Scala 版本?
  • 从第一页开始This version of jacks has been tested against Scala 2.9.3, 2.10.2 and Jackson 2.2.2
  • 我正在使用 Scala 2.9.3-RC2。在将 jar 文件添加到项目后,立即收到错误 jacks_2.10-2.2.2.jar 与不兼容版本的 Scala (2.10) 交叉编译。
  • 我在 2.10.2 中使用它。你选对了吗?根据我的 maven repo,2.9.3 版本是<dependency> <groupId>com.lambdaworks</groupId> <artifactId>jacks_2.9.3</artifactId> <version>2.2.0</version> </dependency>
  • 我也是这样做的。代码中没有错误。但是,eclipse 显示了 2 个问题 1) Scala 编译器中的错误,2) SBT 构建器在编译时崩溃。我还需要添加杰克逊罐子吗?
【解决方案2】:

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

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

import org.json4s.native.JsonFormats.parse

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

【讨论】:

    【解决方案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 数据的更多详细信息,请参阅 here。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多