2016-05-24 9 views
5

मुझे अपने सर्वर (22 से अधिक फ़ील्ड) पर एक बड़ा JSON प्राप्त करने की आवश्यकता है।प्ले फ्रेमवर्क स्कैला प्रारूप बड़े JSON (कोई अनुपयोगी या अनुपयोगी फ़ंक्शन पाया गया)

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 
    ... 
) 

और JSON नियंत्रक में प्रारूप समारोह:

implicit val filtersFormat = Json.format[Filters]

संकलन मैं त्रुटि है: मैं क्षेत्रों का एक बहुत के साथ एक मामले वर्ग है

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

वहाँ है जेएसओएन को छोटे हिस्सों में तोड़ने के बिना समस्या को हल करने का एक तरीका?

+1

अपनी 'केस क्लास' को तोड़ दें, और 'लागू करें' फ़ंक्शन को नेस्टेड 'केस क्लास' संरचना बनाएं। –

+0

केस क्लास को तोड़ने के बिना यह संभव नहीं है। मेरे जेसन में 100 से अधिक फ़ील्ड हैं और मैंने इसे पहले से ही 5 केस क्लास में तोड़ दिया है, और घोंसले से यह मेरे व्यापार तर्क को बहुत जटिल बना रहा है। –

उत्तर

1

मैं इसे इस तरह से किया था:

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

प्रश्न के अनुसार कृपया छोटे भागों में तोड़ने के बिना इसे करें। – owensmartin

0

यह भी मैन्युअल रूप से ऐसा करने का विकल्प है, और प्रारूप के साथ नहीं, पढ़ता है या लिखते हैं:

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 
) 
} 

हम कई मामले कक्षाएं हैं कि है 22 कॉलम से पारित किया गया और सभी सही ढंग से टुकड़ों में अलग किए बिना काम करते हैं।

संबंधित मुद्दे