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

问题描述 投票:1回答:2

我希望能够从伴侣对象读取和写入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实例可用

scala playframework
2个回答
1
投票

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

以下错误:

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

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

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

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


3
投票

这样做是这样的:

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)
  }

}
© www.soinside.com 2019 - 2024. All rights reserved.