【问题标题】:Scala implicit read and write for multi layered mapScala隐式读写多层地图
【发布时间】:2019-11-19 05:30:00
【问题描述】:

我已经定义了一个多层地图:

import collection.mutable.Map
var modelsRef = Map[String,Map[String,Array[String]]]()

并用数据填充它;例如通过使用:

myMap.update("a", Map("b1" -> Array("c","d","e","f")))
myMap("a").update("b2", Array("g","h"))

我想将结果写入json 文件,然后从文件中读取它并重新构建映射结构。我正在使用 maven Scala,我正在考虑使用 Play 或等效包。我在其他帖子中读到我需要定义一个case class,然后写一个implicit Writer and Reader。如果有人可以向我展示这样复杂的多层地图的外观,我将不胜感激?

【问题讨论】:

  • 不推荐在模型 API 中使用Array(可变)。您选择的 json 库有哪些尝试?
  • 我尝试了 Ivan 建议的解决方案。但我收到以下两个错误:“找不到参数编码器的隐式值”和“方法 asJson 的参数不足”。如果您对如何解决这些问题有任何建议,我将不胜感激。

标签: json scala dictionary


【解决方案1】:

您不需要定义任何特殊情况类,因为大多数 json 库默认支持“基本”类型,如 Map、String、Array 等。

使用circe 完成的示例。

  import scala.collection.mutable
  import io.circe.parser._
  import io.circe.syntax._

  var map = mutable.Map[String, mutable.Map[String, mutable.ArrayBuffer[String]]]()
  map.update("a", mutable.Map("b1" -> mutable.ArrayBuffer("c", "d", "e", "f")))
  map("a").update("b2", mutable.ArrayBuffer("g", "h"))
  val json = map.asJson.pretty(Printer.noSpaces)

  println(json)
  // {"a":{"b2":["g","h"],"b1":["c","d","e","f"]}}
  println(decode[Map[String, Map[String, Seq[String]]]](json))
  // Right(Map(a -> Map(b2 -> List(g, h), b1 -> List(c, d, e, f))))

请注意,您不需要使用可变集合将 json 读回结构。在我的示例中,我在 decode 方法中使用了不可变集合。

更新

我用 Scala 2.12.8 和大约 0.11.2 测试了上面的代码。 maven的依赖是

<dependency>
    <groupId>io.circe</groupId>
    <artifactId>circe-core_2.12</artifactId>
    <version>0.11.2</version>
</dependency>
<dependency>
    <groupId>io.circe</groupId>
    <artifactId>circe-parser_2.12</artifactId>
    <version>0.11.2</version>
</dependency>

【讨论】:

  • 关于为什么我收到以下错误的任何建议 val json = map.asJson.pretty(Printer.noSpaces): 1) 错误:找不到参数编码器的隐含值:io.circe.Encoder [scala.collection.mutable.Map[String,scala.collection.mutable.Map[String,scala.collection.mutable.ArrayBuffer[String]]]] 2)错误:方法asJson的参数不足:(隐式编码器:io .circe.Encoder[scala.collection.mutable.Map[String,scala.collection.mutable.Map[String,scala.collection.mutable.ArrayBuffer[String]]]])io.circe.Json。未指定值参数编码器。
  • 为了提供更多信息,我在我的 maven pom 中添加了 'circe-parser_2.11' 以激活那些 'import io.circe' 行。我还尝试在我的代码中添加“import io.circe.{Decoder, Encoder}”,但是它仍然是灰色的,并且无助于消除上述错误。
猜你喜欢
  • 2015-05-02
  • 2020-12-08
  • 2019-01-10
  • 1970-01-01
  • 2018-03-05
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多