Scala/Play 如何使用 JSON 读取来处理 JSON 可以是字符串或数组的值并且总是 return Set[String]
Scala/Play How to use JSON read to handle JSON value that can be string or array and always return Set[String]
我的播放服务器中有以下 class 和用于验证的 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 值以及字符串和字符串数组
您可以在 json Reads
上使用运算符 orElse
来创建您的自定义 reader:
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 _)
您可以使用 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 _)
我的播放服务器中有以下 class 和用于验证的 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 值以及字符串和字符串数组
您可以在 json Reads
上使用运算符 orElse
来创建您的自定义 reader:
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 _)
您可以使用 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 _)