【问题标题】:no instance of play.api.libs.json.format is available for scala.option[scala.any]scala.option[scala.any] 没有 play.api.libs.json.format 的实例
【发布时间】:2021-02-23 05:00:02
【问题描述】:

我只是想创建一个案例类的 Json 格式(使用 play json),其中包含 Scala 中的任何数据类型的字段

import play.api.libs.json.{Format, Json}
case class Basics(
                   label:Option[String],
                   key:Option[String],
                   name:Option[String],
                   value:Option[Any],
                   field_type:Option[String]
                 )
object Basics{
  implicit val format:Format[Basics]=Json.format
}

当我编译我的代码时,它会说..

no instance of play.api.libs.json.format is available for scala.option[scala.any]

我采用 Any 类型,因为“值”字段可能是字符串或布尔类型。 有什么建议我遗漏了什么吗?

【问题讨论】:

  • 类型类机制无法与Any 一起正常工作。那完全打败它。无论如何,Any 远不推荐,特别是作为案例类属性。

标签: scala case-class play-json


【解决方案1】:

找到了解决办法..

   object Basics{
  implicit val anyReads: Reads[Any] = Reads[Any](m => JsonFormatConverter.metaValueToJsValue(m))
  implicit val WritesAny: Writes[Any] = JsonFormatConverter.anyWrite
  implicit val format:Format[Basics] = Json.format[Basics]
}

object JsonFormatConverter {

  def metaValueToJsValue(m: JsValue): JsResult[Any] = {
    m match {
      case JsString(s) => JsSuccess(s)
      case JsBoolean(b) => JsSuccess(b)
    }
  }

  val anyWrite:Writes[Any]=Writes[Any]{
  res=>
   res match {
      case x: String => JsString(x)
      case x: Boolean => JsBoolean(x)
   }
  }
}

【讨论】:

  • Any 声明一个Reads(或任何类型的类实例)是个坏主意,肯定会导致隐式解析问题
猜你喜欢
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多