5

Ich habe folgende JSON Leser in Play 2.3:Wiedergabe Json Liest und String

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

und der Compiler gibt mir den Fehler

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

wenn ich ein implicit val verwende ich

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] 
bekommen

Wie bekomme ich es zur Arbeit?

Antwort

5

ich einen anderen Fehler, aber es funktioniert gut für mich, wenn ich einen expliziten Typ-Parameter zu minLength hinzufügen:

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

Ich denke, das Problem mit, dass bis zu den Compiler zu verlassen ist, dass es verschiedene Kombinationen von implicits in scope, die die implizite Parameterliste von minLength erfüllen würde.

0

DefaultReads Leser, die Sie benötigen json Werte gängigen Typen für die Transformation (String, Option, Array, etc.). Eine Bereitstellung neuer Leser für String ist nicht erforderlich.

Damit Sie auf ein Feld in Ihrem JSON-Objekt zugreifen können, müssen Sie kein Lesegerät definieren, es sei denn, Sie möchten dieses Feld in einen beliebigen Typ von Ihnen einlesen.

Alles, was Sie in diesem Fall benötigen, ist die Einschränkung, die sowohl in Reads als auch in Constraints definiert ist. Also vorausgesetzt, dass Ihr JSON-Objekt ist jsValue der folgende Code gibt Ihnen, was Sie wollen:

// val jsValue = ... 

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

das gibt mir den gleichen Fehler leider – elmalto

+0

Lassen Sie Ihre implizite Leser entfernt? (lösche einfach 'val airportSearchReads: Liest [String] = (JsPath \" search "). lese [String] (minLength (3)' first). –

+0

immer noch das gleiche Problem ... Lösung oben funktioniert aber, also werde ich nutze das. vielen dank für ihre hilfe – elmalto

Verwandte Themen