[英]Play Json Reads and String
我在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]
我如何让它工作?
我得到一个不同的错误,但如果我向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
的隐式参数列表。
DefaultReads
为读者提供了将json值转换为常用类型( String
, Option
, Array
等)所需的读者。 因此,不需要为String
提供新的读者。
因此,为了访问json对象中的字段,您不需要定义读取器,除非您想将该字段读入您的任意类型。
在这种情况下,您所需要的只是在Reads
和Constraints
定义的Constraints
。 因此,假设您的json对象是jsValue
,以下代码为您提供了所需内容:
// val jsValue = ...
(jsValue \ "search").as[String](Reads.minLength(3))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.