json - 没有 play.api.libs.json.Format 的实例可用于 scala.Predef.Map[java.lang.String, scala.Option[scala.Double]]

标签 json scala playframework play-json

尝试为包含选项映射的实体编写 json 格式。它抛出以下错误

Error:(8, 68) No instance of play.api.libs.json.Format is available for scala.Predef.Map[java.lang.String, scala.Option[scala.Double]] in the implicit scope (Hint: if declared in the same file, make sure it's declared before)

代码片段:

import play.api.libs.json.{Json, OFormat}

val a: Map[String, Option[Double]] = Map("a" -> None)

case class Person(x: Map[String, Option[Double]])

object Person {
  implicit val personFormat: OFormat[Person] = Json.format[Person]
}

Json.toJson(Person(a))

最佳答案

您可以定义隐式:

  import scala.collection.Map

  object Person {
    implicit object MapReads extends Reads[Map[String, Option[Double]]] {
      def reads(jsValue: JsValue): JsResult[Map[String, Option[Double]]] = jsValue match {
        case JsObject(map) => JsSuccess(
          map.mapValues {
            case JsNumber(d) => Some(d.toDouble)
            case _ => None
          }
        )
        case _ => JsError()
      }
    }

    implicit object MapWrites extends Writes[Map[String, Option[Double]]] {
      def writes(map: Map[String, Option[Double]]): JsValue =
        JsObject(map.mapValues(optd => JsNumber(optd.getOrElse[Double](0.0))))
    }

    implicit val personFormat: OFormat[Person] = Json.format[Person]
  }

  println(Json.toJson(Person(a)))//{"x":{"a":0}}

基于 answer .

关于json - 没有 play.api.libs.json.Format 的实例可用于 scala.Predef.Map[java.lang.String, scala.Option[scala.Double]],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47178326/

相关文章:

java - 无法从 Jersey GET 响应中获取 JSON 数据

javascript - 组合 JSON 数组

java - 解析 JSON 时出现问题

json - 对一个值进行字符串操作,并用 jq 返回原始 JSON 文档

scala - 将带有默认参数的函数传递给高阶函数

scala - 在 Play 中使用 Scala 2.9.2?

java - 如何在eclipse中运行play framework单元测试

playframework - Play 模板引擎: how to pass an implicit parameter

scala - 如何在 Play2.1 框架中利用 SLF4J varargs 日志记录?

Scala - 推断类型参数