[英]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.