2017-02-11 4 views
0

セット[文字列]文字列または配列でも、常に返すことができますJSON値を処理するために読んで使用するためにどのように再生するとJSONは、検証のために使用読み込みスカラ/ JSONは私のプレイサーバーに以下のクラスを持っている

case class Foo(name: String, link: String) 

val fooReads = (
    (__ \ "name").read[String] ~ 
    (__ \ "link").read[String] 
)(Foo.apply _) 

私はので、私は入力JSONで文字列の配列を期待できる代わりに、1の複数のリンクを許可するようにモデルを変更した:

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値を扱うことができるので、それがバック適合するようにしたいです文字列の配列で

答えて

3

あなたのカスタムリーダーを作成するには、JSON ReadsにオペレータorElseを使用することができます。

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

あまりにも速い@vdebergue ;-) – cchantep

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

をためすぎていただきありがとうございます答え、どちらも同じで、仕事です! –

関連する問題