2010-11-06 16 views
9

को deserialize नहीं कर सकता है मैं लिफ्ट फ्रेमवर्क का उपयोग कर JSON पाठ को deserialize करने की कोशिश कर रहा हूं, और ऐसा नहीं लगता है कि वे Seq विशेषता का समर्थन करते हैं (हालांकि सूची समर्थित है)। एक उदाहरण के रूप ...लिफ्ट फ्रेमवर्क JSON डेटा

(प्रथम और अंतिम नाम के साथ) कर्मचारियों का प्रतिनिधित्व करने कुछ JSON डेटा ...

{"employees":[{"fname":"Bob","lname":"Hope"},{"fname":"Bob","lname":"Smith"}]} 

यहाँ कर्मचारी डोमेन-वस्तुओं है:

case class Employee(fname: String, lname: String) { } 
case class Employees(employees: Seq[Employee]) { } 

और यहाँ मेरी JSON है deserialization कोड ...

class EmployeeTest { 

    @Test def test() { 
    val jsonText: String = .... 
    val e = deserialize(jsonText) 
    } 

    def deserialize(in: String): Employees = { 
    implicit val formats = net.liftweb.json.DefaultFormats 
    net.liftweb.json.Serialization.read[Employees](in) 
    } 
} 

यदि मैं कर्मचारी डोमेन ऑब्जेक्ट को सेक के बजाय सूची का उपयोग करने के लिए बदलता हूं, वें यह काम करता है। लेकिन अगर मैं कर सकता तो मैं वास्तव में सेक का उपयोग करना चाहता हूं।

यहां अपवाद है जब मैं उपरोक्त कोड चलाता हूं (सेक का उपयोग करके): क्या ऐसा कुछ है जो मैं इसे काम करने के लिए कर सकता हूं? आपकी सहायताके लिए धन्यवाद!

net.liftweb.json.MappingException: unknown error 
    at net.liftweb.json.Extraction$.extract(Extraction.scala:43) 
    at net.liftweb.json.JsonAST$JValue.extract(JsonAST.scala:288) 
    at net.liftweb.json.Serialization$.read(Serialization.scala:50) 
    at EmployeeTest.deserialize(EmployeeTest.scala:20) 
    at EmployeeTest.test(EmployeeTest.scala:13) 
Caused by: java.lang.UnsupportedOperationException: tail of empty list 
    at scala.collection.immutable.Nil$.tail(List.scala:388) 
    at scala.collection.immutable.Nil$.tail(List.scala:383) 
    at net.liftweb.json.Meta$Constructor.bestMatching(Meta.scala:60) 
    at net.liftweb.json.Extraction$.findBestConstructor$1(Extraction.scala:187) 
    at net.liftweb.json.Extraction$.instantiate$1(Extraction.scala:192) 
    at net.liftweb.json.Extraction$.newInstance$1(Extraction.scala:222) 
    at net.liftweb.json.Extraction$.build$1(Extraction.scala:240) 
    at net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:269) 
    at net.liftweb.json.Extraction$.build$1(Extraction.scala:242) 
    at net.liftweb.json.Extraction$$anonfun$4.apply(Extraction.scala:194) 
    at net.liftweb.json.Extraction$$anonfun$4.apply(Extraction.scala:194) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:206) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:206) 
    at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:61) 
    at scala.collection.immutable.List.foreach(List.scala:45) 
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:206) 
    at scala.collection.immutable.List.map(List.scala:45) 
    at net.liftweb.json.Extraction$.instantiate$1(Extraction.scala:194) 
    at net.liftweb.json.Extraction$.newInstance$1(Extraction.scala:222) 
    at net.liftweb.json.Extraction$.build$1(Extraction.scala:240) 
    at net.liftweb.json.Extraction$.extract(Extraction.scala:284) 
    at net.liftweb.json.Extraction$.extract0(Extraction.scala:172) 
    at net.liftweb.json.Extraction$.extract(Extraction.scala:40) 
    ... 33 more 
+0

मैं इस समस्या में पड़ गए भी आपको खुशी है कि आपने इस सवाल से पूछा था। यह अच्छा होगा अगर लिफ्ट-जेसन ने एक अधिक जानकारीपूर्ण त्रुटि संदेश मुद्रित किया। –

उत्तर

13

सीईसी क्रमबद्धता में समर्थित नहीं है क्योंकि यह ठोस प्रकार नहीं है। Deserialization के दौरान कोई प्रकार की जानकारी नहीं है जिसका उपयोग ठोस कार्यान्वयन पर निर्णय लेने के लिए किया जा सकता है। हम एक डिफ़ॉल्ट कार्यान्वयन के रूप में उदाहरण के लिए सूची का उपयोग कर सकते हैं, लेकिन फिर निम्न संपत्ति नहीं रह गया है सभी प्रकार के लिए पकड़ होगा: इस प्रकार

deserialize(serialize(x)) == x 

इस विशेष मामले deserialized जा सकता है:

import net.liftweb.json._ 
import net.liftweb.json.JsonAST._ 

case class Employee(fname: String, lname: String) 
case class Employees(employees: Seq[Employee]) 

object Test extends Application { 
    implicit val formats = DefaultFormats 
    val s = """ {"employees":[{"fname":"Bob","lname":"Hope"},{"fname":"Bob","lname":"Smith"}]} """ 

    val json = JsonParser.parse(s) 
    val employees = Employees(for { 
    JArray(emps) <- json \ "employees" 
    emp <- emps 
    } yield emp.extract[Employee]) 

    println(employees) 
} 
+0

स्पष्ट स्पष्टीकरण के लिए धन्यवाद! – shj

+0

@shj, शायद आप इसे एक सही उत्तर चिह्नित कर सकते हैं। – Randin

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