7

我在 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]

我如何让它工作?

4

2 回答 2

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

我认为将其留给编译器的问题在于,范围内有不同的隐式组合可以满足minLength.

于 2014-11-01T13:55:00.927 回答
0

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

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

Reads在这种情况下,您需要的只是在和中定义的约束Constraints。所以假设你的 json 对象是jsValue下面的代码给你你想要的:

// val jsValue = ...

(jsValue \ "search").as[String](Reads.minLength(3))
于 2014-11-02T06:33:01.640 回答