Играть JSON читает и строка


У меня есть следующий читатель JSON в игре 2.3:

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]

Как заставить его работать?

2 5

2 ответа:

Я получаю другую ошибку, но она отлично работает для меня, если я добавляю явный параметр типа в 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

Я думаю, что проблема с предоставлением этого компилятору заключается в том, что существуют различные комбинации имплицитов в области видимости, которые удовлетворяли бы неявному списку параметров minLength.

DefaultReads предоставляет средства чтения, необходимые для преобразования значений json в общие типы (String, Option, Array, и т.д.). Поэтому предоставление новых читателей для String не является необходимым.

Следовательно, для доступа к полю в вашем объекте json вам не нужно определять средство чтения, если вы не хотите прочитать это поле в произвольный тип вашего.

Все, что вам нужно в этом случае, - это ограничение, которое определено как в Reads, так и в Constraints. Итак, предполагая, что ваш объект json является jsValue, следующий код дает ты чего хочешь:
// val jsValue = ...

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