Scala / Play如何使用JSON读取来处理可以是字符串或数组的JSON值并始终返回Set [String]

时间:2017-02-11 16:05:37

标签: json scala playframework playframework-2.0

我的播放服务器中有以下类,用于验证的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值

2 个答案:

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