繁体   English   中英

播放Json Reads和String

[英]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值转换为常用类型( StringOptionArray等)所需的读者。 因此,不需要为String提供新的读者。

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

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

// val jsValue = ...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM