播放Json Reads和String

时间:2014-10-31 22:13:01

标签: json scala playframework playframework-2.0 playframework-json

我在Play 2.3中有以下JSON阅读器:

import play.api.libs.json._
import play.api.libs.json.Reads._
val airportSearchReads: Reads[String] = (JsPath \ "search").read[String](minLength(3))

并且编译器给出了错误

diverging implicit expansion for type play.api.libs.json.Reads[M]
starting with method ArrayReads in trait DefaultReads

如果我使用implicit val

 ambiguous implicit values:
 both value uuidReads in trait DefaultReads of type => play.api.libs.json.Reads[java.util.UUID]
 and value airportSearchReads in object AirportSearch of type => play.api.libs.json.Reads[String]
 match expected type play.api.libs.json.Reads[M]

如何让它发挥作用?

2 个答案:

答案 0 :(得分:6)

我得到了一个不同的错误,但如果我向minLength添加一个显式类型参数,它对我来说很好:

scala> val airportSearchReads: Reads[String] = (JsPath \ "search").read[String](minLength[String](3))
airportSearchReads: play.api.libs.json.Reads[String] = play.api.libs.json.Reads$$anon$8@3fee86da

我认为将该问题留给编译器的问题是,范围中存在不同的implicits组合,以满足minLength的隐式参数列表。

答案 1 :(得分:0)

DefaultReads为您提供了将json值转换为常见类型(StringOptionArray等)所需的读者。因此,没有必要为String提供新读者。

因此,要访问json对象中的字段,您不需要定义阅读器,除非您想将该字段读入您的任意类型。

在这种情况下,您只需要在ReadsConstraints中定义的约束。因此,假设您的json对象为jsValue,以下代码为您提供了所需内容:

// val jsValue = ...

(jsValue \ "search").as[String](Reads.minLength(3))