Scala Play Framework 2.6密封特征格式给Json

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala Play Framework 2.6密封特征格式给Json相关的知识,希望对你有一定的参考价值。

我希望能够从伴侣对象读取和写入Json格式。在案例类中,我定义了currency作为密封特征Currency的类型,以便能够限制它可以的值。

我有这个案例类及其伴随对象

case class Payment(
  id: Long,
  amount: BigDecimal,
  currency: Currency
)

object Payment {
  implicit val paymentFormat = Json.format[Payment]
  val tupled = (this.apply _).tupled
}

这种密封的特性

sealed trait Currency { def name: String }
case object EUR extends Currency { val name = "eur" }
case object USD extends Currency { val name = "usd" }
case class UnknownCurrency(name: String) extends Currency

我希望能够将对象转换为json做Json.toJson(payment)或者当它作为json时读取。但是我不能,因为我在paymentFormat中有一些错误。我试过这个

object Currency {
  implicit object CurrencyFormat extends Format[Currency] {
    implicit def reads(json: JsValue) =
      json match {
        case JsString("eur") => JsSuccess(EUR)
        case JsString("usd") => JsSuccess(USD)
        case _ => JsError("cannot parse it")
      }
    implicit def writes(currency: Currency) = JsString(currency.name.toString)
  }
}

当我尝试编译项目时,我收到此错误

隐式范围内的models.entities.EUR没有Reads实例可用

答案

当我们最终在问题评论中解决您的问题时,我将修复评论作为答案发布在此处:

以下错误:

隐式范围内的models.entities.EUR没有Reads实例可用

通过正确导入Format实例来修复。像这样例如:

implicit lazy val currencyFormat: Format[Currency] = Currency.CurrencyFormat

因此,如果有人遇到类似问题,请检查您是否正确导入了Format实例;)

另一答案

这样做是这样的:

object Currency {

  implicit val reads: Reads[Currency] = Reads {
    case JsString("eur") => JsSuccess(EUR)
    case JsString("usd") => JsSuccess(USD)
    case _ => JsError("cannot parse it")
  }

  implicit val writes: Writes[Currency] = Writes { currency =>
    JsString(currency.name.toString)
  }

}

以上是关于Scala Play Framework 2.6密封特征格式给Json的主要内容,如果未能解决你的问题,请参考以下文章

Play Framework 2.6 中未触发 Slick (postgresql) 演变

Netbeans + Scala + play-framework:找不到 index.html

如何使用 Scala 登录 Play Framework?

Play framework + Scala:使用动作组合注入依赖

Play Framework Routes 中的 Scala 反引号

Scala + Play Framework + Slick - Json 作为模型字段