2010-10-01 9 views
11

क्या मानचित्र की तरह कार्य करने के लिए लिफ्ट-जेसन लाइब्रेरी की जॉब्जेक्ट क्लास का उपयोग करने का कोई तरीका है?क्या मैं एक JSON को मानचित्र में पार्स करने के लिए स्कैला लिफ्ट-जेसन लाइब्रेरी का उपयोग कर सकता हूं?

उदाहरण के लिए:

val json = """ 
{ "_id" : { "$oid" : "4ca63596ae65a71dd376938e"} , "foo" : "bar" , "size" : 5} 
""" 

val record = JsonParser.parse(json) 
record: net.liftweb.json.JsonAST.JValue = JObject(List(JField(_id,JObject(List(JField($oid,JString(4ca63596ae65a71dd376938e))))), JField(foo,JString(bar)), JField(size,JInt(5)))) 

</code> 

मैं अपेक्षा की होगी रिकॉर्ड ("foo") "बार" लौटने के लिए

मैं एक मूल्यों समारोह देखा है और यह एक मानचित्र बाहर प्रिंट लेकिन वास्तविक वस्तु एक है JValue.this.Values?

scala> record.values res43: record.Values = Map((_id,Map($oid -> 4ca63596ae65a71dd376938e)), (foo,bar), (size,5))

scala> record.values("foo") :12: error: record.values of type record.Values does not take parameters record.values("foo")

एक मामले वर्ग निकालने लिफ्ट json पुस्तकालय के साथ उदाहरण हैं लेकिन इस मामले में, मैं पहले से json स्कीमा पता नहीं है।

+0

यह ऐसा मामला कक्षाओं में एक पैरामीटर के रूप में मानचित्र पार्स करने के लिए एक संबंधित जवाब है http://stackoverflow.com/questions/5051290/deserializing-case-classes-with-mapstring-any-properties-with-lift-json/6310493#6310493 –

उत्तर

12

आप कार्यान्वयन को देखें, तो आप

case class JObject(obj: List[JField]) extends JValue { 
    type Values = Map[String, Any] 
    def values = Map() ++ obj.map(_.values.asInstanceOf[(String, Any)]) // FIXME compiler fails if cast is removed 
} 

देखेंगे तो यह काम करना चाहिए:

record.values.asInstanceOf[Map[String, Any]]("foo") 

तुम भी

record.values.apply("foo") 
+0

धन्यवाद, पहला काम करता है, आवेदन का उपयोग करने का दूसरा विकल्प () एक त्रुटि देता है। मैंने स्कैला के बिल्टिन जावा पार्सर का उपयोग समाप्त कर दिया। scala.util.parsing.json.JSON.parseFull (रिकॉर्ड) कुछ (मानचित्र) या कुछ (सूची) –

7

JValue.Values ​​की कोशिश कर सकते एक है पथ निर्भर प्रकार। मतलब यह है कि यदि आप जेस्ट्रिंग को पकड़ते हैं तो यह एक स्ट्रिंग होगा, या यदि आपको जेएआरएआर मिलती है तो यह एक सूची होगी [कोई भी]। यदि आप सुनिश्चित हैं कि जेएसओएन आप पार्स एक JSON ऑब्जेक्ट है तो आप इसे उचित प्रकार पर डाल सकते हैं।

val record = JsonParser.parse(json).asInstanceOf[JObject] 

JObject के लिए एक रास्ता निर्भर प्रकार एक मानचित्र [स्ट्रिंग, किसी भी], इस प्रकार है:

जिज्ञासा से
scala> record.values("foo")          
res0: Any = bar 

बस, यह थोड़ा समस्याग्रस्त आप के आकार पता नहीं है अगर नहीं है डेटा जो आप पार्स करने जा रहे हैं?

ध्यान दें, यदि आपका डेटा (नाम, विवरण, उम्र) शामिल हैं और उम्र वैकल्पिक है आप में है कि JSON पढ़ सकते हैं:

case class Person(name: String, description: String, age: Option[Int]) 
+0

लौटाएगा मेरे पास एक जेसन है जिसमें विभिन्न फ़ील्ड हैं। पूर्व के लिए पहले दस्तावेज़ में (नाम, विवरण, आयु) हो सकती है लेकिन दूसरे दस्तावेज़ में केवल निर्दिष्ट (नाम, आयु) हो सकती है। अगर मैं स्कैला के मानचित्र ऑब्जेक्ट का उपयोग करता हूं, तो मैं सिर्फ दस्तावेज़ को कॉल कर सकता हूं .getOrElse ("foo", "") –

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

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