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