【问题标题】:How do I create a JSON format for Map[Int, Int] using Play Framework JSON libs?如何使用 Play Framework JSON 库为 Map[Int, Int] 创建 JSON 格式?
【发布时间】:2014-10-06 20:53:12
【问题描述】:

我想使用 Play Framework JSON 库序列化 Map[Int, Int]。我想要类似的东西

import play.api.libs.json._ implicit val formatIntMap = Json.format[Map[Int, Int]]

然而,该代码得到一个No unapply function found,我认为这是指Map 没有提取器这一事实,因为它不是一个简单的案例类。

【问题讨论】:

  • 我将通过在 play.api.libs.json.Reads、Reads.scala 中指向 Map[String, _] 的现有读取代码来帮助您。这应该是一个很好的起点。
  • 您希望如何编码?作为键转换为字符串的对象,作为二元素数组的数组等?
  • 啊,我在想只是一个带有整数键的 JS 对象,或者,如果这不合法,那就是字符串键。

标签: json scala playframework-2.0


【解决方案1】:

它将尝试创建一个 JsObject,但失败了,因为它将一个 String 映射到一个 JsValue,而不是一个 Int 到一个 JsValue。您需要告诉它如何将您的密钥转换为字符串。

  implicit val jsonWrites = new Writes[Map[Int, Int]] {
    def writes(o: Map[Int, Int]): JsValue = {
      val keyAsString = o.map { kv => kv._1.toString -> kv._2} // Convert to Map[String,Int] which it can convert
      Json.toJson(keyAsString)
    }
  }

这会将包含 0 -> 123 的 Map[Int, Int] 变成

JsObject(
    Seq(
        ("0", JsNumber(123))
    )
)

【讨论】:

  • 可以添加对应的jsonReads吗?
猜你喜欢
  • 1970-01-01
  • 2015-02-01
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 2016-06-01
  • 2019-12-14
  • 2019-01-01
  • 1970-01-01
相关资源
最近更新 更多