15

के साथ जेसन को ऑरियलाइजिंग ऑब्जेक्ट्स मैं जेसन में कुछ अपेक्षाकृत सरल मॉडल को क्रमबद्ध करने की कोशिश कर रहा हूं। उदाहरण के लिए, मैं के json प्रतिनिधित्व प्राप्त करना चाहते हैं:play.api.libs.json

case class User(val id: Long, val firstName: String, val lastName: String, val email: Option[String]) { 
    def this() = this(0, "","", Some("")) 
} 

मैं के साथ उचित पढ़ता है और तरीकों लिखते हैं या कुछ अन्य तरीका है अपने ही स्वरूप [उपयोगकर्ता] लिखने की ज़रूरत है? मैंने https://github.com/playframework/Play20/wiki/Scalajson पर देखा है लेकिन मैं अभी भी थोड़ा सा खो गया हूं।

उत्तर

22

हां, अपना खुद का Format उदाहरण लिखना the recommended approach है। उदाहरण के लिए निम्नलिखित वर्ग को देखते हुए:

case class User(
    id: Long, 
    firstName: String, 
    lastName: String, 
    email: Option[String] 
) { 
    def this() = this(0, "","", Some("")) 
} 

उदाहरण इस प्रकार दिखाई देंगे:

import play.api.libs.json._ 

implicit object UserFormat extends Format[User] { 
    def reads(json: JsValue) = User(
    (json \ "id").as[Long], 
    (json \ "firstName").as[String], 
    (json \ "lastName").as[String], 
    (json \ "email").as[Option[String]] 
) 

    def writes(user: User) = JsObject(Seq(
    "id" -> JsNumber(user.id), 
    "firstName" -> JsString(user.firstName), 
    "lastName" -> JsString(user.lastName), 
    "email" -> Json.toJson(user.email) 
)) 
} 

और तुम इस तरह यह प्रयोग करना होगा:

scala> User(1L, "Some", "Person", Some("[email protected]")) 
res0: User = User(1,Some,Person,Some([email protected])) 

scala> Json.toJson(res0) 
res1: play.api.libs.json.JsValue = {"id":1,"firstName":"Some","lastName":"Person","email":"[email protected].com"} 

scala> res1.as[User] 
res2: User = User(1,Some,Person,Some([email protected])) 

अधिक जानकारी के लिए देखें the documentation । अपने स्वयं के स्वरूप [उपयोगकर्ता] लेखन के बिना

implicit val userImplicitWrites = Json.writes[User] 
val jsUserValue = Json.toJson(userObject) 

:

+0

बढ़िया है, धन्यवाद:

implicit val userImplicitReads = Json.reads[User] 

मैं इसे डॉक्स में नहीं मिला है, यहाँ api के लिए कड़ी है! और क्या होगा यदि मैं एक सेक [उपयोगकर्ता] जेसन के रूप में चाहता था? :) – LuxuryMode

+0

Play 'Seq' के लिए एक उदाहरण के साथ आता है, इसलिए आप केवल 'Json.toJson (उपयोगकर्ता) .as [Seq [उपयोगकर्ता]]' का उपयोग कर सकते हैं। –

+0

मोंगो के साथ Play's 'JsNumber' का उपयोग करके, मुझे एक क्रमबद्धता त्रुटि मिलती है:' [त्रुटि] खेल - कार्रवाई का आह्वान नहीं कर सकता है, अंततः एक त्रुटि मिली: java.lang.IllegalArgumentException: कक्षा scala.math.bigDecimal ' –

6

तथ्य उपयोगकर्ता के लिए धन्यवाद एक मामले वर्ग आप भी कुछ इस तरह कर सकता है। आप पढ़ता के साथ एक ही कर सकता है: http://www.playframework.com/documentation/2.2.x/api/scala/index.html#play.api.libs.json.Json $

+0

बस पूर्णता के लिए - implicits का उपयोग किए बिना: 'Json.reads [उपयोगकर्ता] .reads (myJson) .get' – Ixx

+0

इसे अब उत्तर के रूप में चिह्नित किया जाना चाहिए। अद्यतन दस्तावेज़ के लिए लिंक यहां दिया गया है: https://www.playframework.com/documentation/2.5.x/ScalaJsonAutomated –