2013-02-07 4 views
33

Im Spiel 2.1 Lesevorgänge werden verwendet, um Json zu Objekten Marshallen. Aber wie kann ich das tun, wenn die Fallklasse nur ein Feld hat? Das Ideom, das für mehr Felder funktioniert, funktioniert nicht, da mit einem Feld 'und' nicht verwendet wird. So bekomme ich keinen FunctionBuilder.Wie json zu Fall-Klasse zu schalten, wenn Fall-Klasse nur ein Feld hat

Der folgende Code gibt mir einen Typkonflikt. Wie kann ich das beheben?

case class Data(stamm: Seq[String]) 


implicit val dataReads = (
    (__ \ "stamm").read(Reads.list[String]) 
)(Data) 

Antwort

41

Als Julien beantwortet, können Sie Einfeld Fall lesen Klassen mit dieser:

case class Person(name: String) 

val personReads: Reads[Person] = 
    (__ \ "name").read[String].map { name => Person(name) } 

Nur einer Ergänzung, wenn Sie schreiben wollen:

val personWrites: Writes[Person] = 
    (__ \ "name").write[String].contramap { (person: Person) => person.name } 

Oder-Format (lesen und schreiben):

val personFormat: Format[Person] = 
    (__ \ "name").format[String].inmap(name => Person(name), (person: Person) => person.name) 

Für Schreib- und Format Sie dies importieren:

import play.api.libs.functional.syntax._ 
+1

Lesen Sie die obigen, in der PersonWrites Beispiel sollte (Name: Person) sein (Person: Person)? – gknauth

+0

Ja, danke! Fest. – yokomizor

+2

Danke Mann! Du hast viel Zeit gespart. Aber die Frage ist, wie Leute Bibliotheken entwerfen - warum diese einfache Sache nicht mit dem gleichen Ansatz wie mit vielen Feldern funktioniert%) –

7

Basierend auf @ yokomizor Antwort, fand ich die einfachste Lösung Erstellen Sie eine Formatter zu sein

0

Noch einfachere Lösung als die akzeptierte:

case class A(value: String) 
val reads = (__ \ "key").read[String].map(A.apply) 
Verwandte Themen