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
Play framework + Scala:使用动作组合注入依赖