我的播放服务器中有以下类,用于验证的JSON读取
case class Foo(name: String, link: String)
val fooReads = (
(__ \ "name").read[String] ~
(__ \ "link").read[String]
)(Foo.apply _)
我已经将模型更改为允许多个链接而不是一个,所以我可以在输入JSON中看到字符串数组:
case class Foo(name: String, link: Set[String])
val fooReads = (
(__ \ "name").read[String] ~
(__ \ "link").read[Set[String]] // it works this way
)(Foo.apply _)
我想让它恢复兼容,因此它可以使用字符串和字符串数组处理"link"
的JSON值
答案 0 :(得分:3)
您可以使用json orElse
上的运算符Reads
来创建自定义阅读器:
val readsSet: Reads[Set[String]] = Reads.of[Set[String]].orElse(Reads.of[String].map(str => Set(str)))
val fooReads = (
(__ \ "name").read[String] ~
(__ \ "link").read[Set[String]](readsSet)
)(Foo.apply _)
答案 1 :(得分:2)
您可以使用Reads.orElse
组合器:
val fooReads: Reads[Foo] = (
(__ \ "name").read[String] ~
(__ \ "link").read(Reads.of[String].map(str => Set(str)).
orElse(Reads.of[Set[String]]))
)(Foo.apply _)