首页 > 解决方案 > Play JSON 中有没有办法为非对象(/数组)定义阅读器?

问题描述

基本上,我有一个这种形状的 JSON:

{
  "color": "#abcdef"
}

所以我写了一个Reads

import java.awt.Color

case class Options(color: Color)

((__ \ "color").read[Color])(Options _)

除了没有读者Color。我的第二次尝试是:

(
  Color.decode((__ \ "color").read[String])
)(Options _)

但这显然也不正确。该文档显示了为{ }(and [ ]) 创建阅读器的方法,但不是为数字或字符串等“原语”创建阅读器的方法。我可以这样做吗?

标签: scalaplay-json

解决方案


你可以做:

case class Options(color: Color)

object Options {
  implicit val colorReads: Reads[Color] = __.read[String].map(Color.decode)
  implicit val optionsReads: Reads[Options] = Json.reads[Options]
}

那么用法是:

val b = Json.parse("{ \"color\": \"#abcdef\"}").as[Options]
println(b) // prints: Options(java.awt.Color[r=171,g=205,b=239])


推荐阅读