5

我有以下的JSON读者播放2.3:播放的Json读取和字符串

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

,如果我使用一个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] 
编译器给我的错误

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

我该如何运作?

回答

5

我得到一个不同的错误,但对我来说工作正常,如果我添加显式类型参数minLength

scala> val airportSearchReads: Reads[String] = (JsPath \ "search").read[String](minLength[String](3)) 
airportSearchReads: play.api.libs.json.Reads[String] = [email protected] 

我觉得跟留下到编译器的问题是,有不同的组合的隐含参数列表minLength

0

DefaultReads提供你需要的转化JSON值常见的类型(StringOptionArray等)的读者。因此,为String提供新读取器是没有必要的。

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

在这种情况下,您只需要在ReadsConstraints中定义的约束。因此,假设你的JSON对象是jsValue下面的代码给你想要的东西:

// val jsValue = ... 

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

这给了我同样的错误不幸 – elmalto 2014-11-03 17:09:27

+0

有你删除您的默许阅读器? (刚刚删除'val airportSearchReads:读取[String] =(JsPath \“search”)。读取[String](minLength(3)'first)。 – 2014-11-04 15:03:03

+0

仍然是同样的问题...解决方案顶部作品虽然,所以我会使用它。非常感谢你的帮助 – elmalto 2014-11-04 19:22:54