Jak włączyć json do klasy case, gdy Klasa case ma tylko jedno pole

W play 2.1 odczyty są używane do tworzenia Json do obiektów. Ale jak Mogę to zrobić, gdy Klasa case ma tylko jedno pole. Ideom, który działa dla większej liczby pól nie działa, tak jak w przypadku jednego pola 'and' nie jest używany. W ten sposób nie dostaję FunctionBuilder.

Poniższy kod daje mi niedopasowanie typu. Jak mogę to naprawić?

case class Data(stamm: Seq[String])


implicit val dataReads  = (
  (__ \ "stamm").read(Reads.list[String])
)(Data)
Author: nebenmir, 2013-02-07

4 answers

Kombinatory Json nie działają dla jednej klasy przypadków pola.

Pascal (autor tego API) wyjaśnił tę sytuację tutaj https://groups.google.com/forum/?fromgroups=#! starred/play-framework / hGrveOkbJ6U

Istnieją pewne obejścia, które działają, jak ten:

case class A(value: List[Int])
val areads = (__ \ 'value).read[List[Int]].map{ l => A(l) } // covariant map
 28
Author: Julien Lafont,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-07 17:11:47

Jak odpowiedział Julien, możesz odczytać klasy przypadków pojedynczych pól używając tego:

case class Person(name: String)

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

Tylko dopełnienie, jeśli chcesz napisać:

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

Lub format (odczyt i zapis):

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

Do zapisu i formatu musisz zaimportować to:

import play.api.libs.functional.syntax._
 44
Author: yokomizor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-23 10:15:21

Na podstawie odpowiedzi @yokomizor znalazłem najprostsze rozwiązanie, aby utworzyć Formatter być

case class Person(name: String)
val personFormatter: Format[Person] =
  (__ \ "full_name").format[String].inmap(Person.apply, unlift(Person.unapply))
 8
Author: Zoltán,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-08 14:05:20

Jeszcze prostsze rozwiązanie niż przyjęte:

case class A(value: String)
val reads = (__ \ "key").read[String].map(A.apply)
 1
Author: mjoliver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-01 00:28:04