2016-05-24 11 views
5

Potrzebuję otrzymać duży JSON na moim serwerze (więcej niż 22 pola). Mam klasy etui z wielu dziedzin:Odtwórz format Scala duży JSON (nie znaleziono funkcji Unapply lub unapplySeq)

case class Filters(objectType: Option[String] = None, 
    deal: Option[String] = None, 
    roomsCount: Option[String] = None, 
    region: Option[Int] = None, 
    district: Option[Int] = None, 
    direction: Option[Int] = None 
    ... 
) 

i JSON funkcji formatowania w kontrolerze:

implicit val filtersFormat = Json.format[Filters]

Na kompilacji mam błąd:

[error] WebSockets.scala:18: No unapply or unapplySeq function found 
[error] implicit val filtersFormat = Json.format[Filters] 
[error]          ^

Czy istnieje sposób na rozwiązanie problemu bez łamania JSON na małe części?

+1

Przerwij swoją "klasę case" i użyj funkcji 'apply', aby utworzyć zagnieżdżoną strukturę' case class'. –

+0

nie jest to możliwe bez zerwania klasy sprawy. Mój json ma ponad 100 pól, a ja już go złamałem w 5 klasach przypadków, dalsze zagnieżdżanie zbyt mocno komplikuje logikę biznesową. –

Odpowiedz

1

zrobiłem to w ten sposób:

case class Filters(part1: Part1, part2: Part2, ...) 

case class Part1(
    field1: Field1, 
    field2: Field2, 
    ... 
    field10: Field10, 
) 

object Part1 { 
    implicit val part1Format = Json.format[Part1] 
} 

... 

object Filters { 
    implicit val filtersReads = (
     JsPath.read[Part1] and 
     JsPath.read[Part2] and 
     ... 
    )(Filters.apply _) 

    implicit val filtersWrites = (
     JsPath.write[Part1] and 
     JsPath.write[Part2] and 
     ... 
    )(unlift(Filters.unapply)) 
} 
+1

Proszę robić to bez dzielenia na małe części, jak na pytanie. – owensmartin

0

Jest również możliwość, aby to zrobić ręcznie, a nie z formatem, czyta lub pisze:

implicit object JsFormatter extends Format[Filter] { 

    private val tagField1 = "field1" 
    private val tagField2 = "field2" 
    private val tagField3 = "field3" 
       ... 
    private val tagFieldN = "fieldN" // N > 22 

    override def reads(json: JsValue): JsResult[Filter] = JsSuccess(
    Filter(
     (json \ tagField1).as[Long], 
     (json \ tagField2).as[Int], 
     (json \ tagField3).as[String], 
        ... 
     (json \ tagFieldn).as[Boolean] 
    ) 
) 

    override def writes(filter: Filter): JsValue = Json.obj(
    tagField1 -> filter.field1, 
    tagField2 -> filter.field2, 
    tagField3 -> filter.field3, 
       ... 
    tagFieldN -> filter.fieldN 
) 
} 

Mamy wiele klas wypadku są przekazywane z 22 kolumn i wszystkie działają poprawnie, bez rozłączania ich na części.

Powiązane problemy