簡體   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