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