2010-11-03 14 views
6

के साथ एक केस क्लास में लिफ्ट-जेसन निकालने के लिए मैंने पिछले दिन इस साइट के उत्तर को खोजने का प्रयास करने के लिए विभिन्न साइटों और लेखों को खोज और पढ़ा है और मुझे कुछ भी मदद नहीं मिली है। मुझे यह भी यकीन नहीं है कि यह संभव है या नहीं। मेरी समस्या यह है कि मैं लिफ्ट-जेसन का उपयोग करके एक जेसन प्रतिक्रिया का विश्लेषण और निकालने की कोशिश कर रहा हूं। प्रतिक्रिया में 4 भाग होते हैं, जहां पहले 3 भाग हर प्रकार के अनुरोध के लिए हर प्रतिक्रिया के लिए हमेशा समान होते हैं। अंतिम भाग अनुरोध के प्रकार के आधार पर भिन्न होता है, लेकिन यह हमेशा किसी प्रकार की सूची बनने जा रहा है। मैं इस तरह कुछ करने के लिए उम्मीद कर रहा था:ऊपरी बाउंड

abstract class MyObjects 
case class Apple(id: Int, name: String, color: String) extends MyObjects 
case class Orange(id: Long, name: String, state: String) extends MyObjects 

abstract class MyResponse 
case class Fruits[T <: MyObjects](aisle: Int, bin: Int, hasWhat: Option[List[T]]) 

कहाँ अगर मैं पता है कि सभी सेब हैं चाहता था, मैं एक अनुरोध है कि के लिए बनाने के लिए और सेब की सूची के साथ एक प्रतिक्रिया वापस मिलेगा। जब मैं इस उदाहरण को निकालने के लिए प्रयास करें:

myJson.extract[Fruits[Apple]] 

मैं इस त्रुटि मिलती है:

net.liftweb.json.MappingException: do not know how to get type parameter from T 
    at net.liftweb.json.Meta$.fail(Meta.scala:128) 
    at net.liftweb.json.Meta$Reflection$.term$1(Meta.scala:206) 
    at net.liftweb.json.Meta$Reflection$.typeParameters(Meta.scala:220) 
    at net.liftweb.json.Meta$.mkContainer$1(Meta.scala:91) 
    at net.liftweb.json.Meta$.fieldMapping$1(Meta.scala:101) 
    at net.liftweb.json.Meta$.mkContainer$1(Meta.scala:90) 
    at net.liftweb.json.Meta$.fieldMapping$1(Meta.scala:107) 
    at net.liftweb.json.Meta$.toArg$1(Meta.scala:117) 
    at net.liftweb.json.Meta$$anonfun$constructors$1$1$$anonfun$apply$1.apply(Meta.scala:83) 
    at net.liftweb.json.Meta$$anonfun$constructors$1$1$$anonfun$apply$1.apply(Meta.scala:82) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:... 

मैं लिफ्ट json उपयोग कर रहा हूँ 2.1 & स्केला 2.8। मेरे पास इसके आसपास काम करने का एक तरीका है, विशेष रूप से प्रत्येक प्रकार की प्रतिक्रिया के लिए केस क्लास बनाकर, लेकिन मैंने सोचा कि मैं जो करने की कोशिश कर रहा था वह क्लीनर था। बस जानना चाहता था कि ए) क्या यह भी संभव है? बी) यदि हां, तो मैं गलत क्या कर रहा हूं?

संपादित करें ... नमूना आवेदन:

val apples = """{ "aisle" : 1, "bin" : 1, 
      "hasWhat" : [{ "id" : 4, "name" : "Granny", "color" : "green"}, 
         { "id" : 4, "name" : "Fuji", "color" : "red"}] }""" 

val oranges = """ { "aisle" : 3, "bin" : 2, 
      "hasWhat" : [{ "id" : 2, "name" : "Navel", "state" : "FL" }, 
         { "id" : 2, "name" : "Clementine", "state" : "Spain" }]}""" 

scala> val aJson = parse(apples) 
aJson: net.liftweb.json.JsonAST.JValue = JObject(List(JField(aisle,JInt(1)), JField(bin,JInt(1)), JField(hasWhat,JArray(List(JObject(List(JField(id,JInt(4)), JField(name,JString(Granny)), JField(color,JString(green)))), JObject(List(JField(id,JInt(4)), JField(name,JString(Fuji)), JField(color,JString(red))))))))) 

scala> val oJson = parse(oranges) 
oJson: net.liftweb.json.JsonAST.JValue = JObject(List(JField(aisle,JInt(3)), JField(bin,JInt(2)), JField(hasWhat,JArray(List(JObject(List(JField(id,JInt(2)), JField(name,JString(Navel)), JField(state,JString(FL))))))))) 

scala> val doesntWork = aJson.extract[Fruits] 
doesntWork: org.spin.node.gogrid.objects.Fruits = Fruits(1,1,None) 

scala> val works = aJson.extract[AFruit] 
works: org.spin.node.gogrid.objects.AFruit = AFruit(1,1,Some(List(Apple(4,Granny,green), Apple(4,Fuji,red)))) 

मैं doesntWork काम करता है की तरह बनना चाहता हूँ, कहाँ:

case class AFruit(aisle: Int, bin: Int, hasWhat: Option[List[Apple]]) 

धन्यवाद! -newbie

उत्तर

8

पैरामीटरयुक्त केस क्लास निकालना अभी तक समर्थित नहीं है। एक कामकाज (सुनिश्चित नहीं है कि यह आपके मामले के लिए काम करता है) फल को ठोस प्रकार बनाना और जेएसओएन में प्रकार की जानकारी जोड़ना है।

import net.liftweb.json._ 
import net.liftweb.json.Extraction._ 
import net.liftweb.json.JsonAST._ 
import net.liftweb.json.Printer._ 

abstract class MyObjects 
case class Apple(id: Int, name: String, color: String) extends MyObjects 
case class Orange(id: Long, name: String, state: String) extends MyObjects 

case class Fruits(aisle: Int, bin: Int, hasWhat: Option[List[MyObjects]]) 

object Test extends Application { 
    // This configuration adds an extra field for MyObjects to JSON 
    // which tells the real type of a MyObject. 
    implicit val formats = Serialization.formats(FullTypeHints(List(classOf[MyObjects]))) 

    val fs = Fruits(0, 0, Some(List(
    Apple(1, "Granny Smith", "green"), 
    Apple(2, "Grenade", "red")))) 
    val json = decompose(fs) 
    println(pretty(render(json))) 

    assert (json.extract[Fruits] == fs) 
} 

प्रिंट यही कारण है कि:

{ 
    "aisle":0, 
    "bin":0, 
    "hasWhat":[{ 
    "jsonClass":"Apple", 
    "id":1, 
    "name":"Granny Smith", 
    "color":"green" 
    },{ 
    "jsonClass":"Apple", 
    "id":2, 
    "name":"Grenade", 
    "color":"red" 
    }] 
} 
+0

हाय जोनी, आपके इनपुट के लिए धन्यवाद, वहाँ कहीं भी मैं अलग विन्यास और कैसे काम करता है क्रमबद्धता पर पढ़ सकते हैं? यह काफी काम नहीं करता है। मैंने अपनी पोस्ट संपादित की और एक उदाहरण के साथ स्पष्ट किया। मुझे सेब और संतरे के लिए तार मिलेंगे और मुझे कामों की तरह कुछ खत्म करने की ज़रूरत है। – CaffiendFrog

+0

हाय, सर्वोत्तम संसाधन इस रीडमे https://github.com/lift/lift/tree/master/framework/lift-base/lift-json/ और उदाहरण (* example.scala) https://github.com में हैं/लिफ्ट/लिफ्ट/पेड़/मास्टर/फ्रेमवर्क/लिफ्ट-बेस/लिफ्ट-जेसन/src/test/scala/net/liftweb/json /। इस बिंदु पर आपके पोस्ट में काम करने में 'नहीं है' कार्य करना संभव नहीं है। यह हो सकता है कि हम भविष्य में प्रतिबिंब कोड को बेहतर बना सकते हैं। – Joni

+0

हाय जोनी, मैं निश्चित रूप से एफ़्रूट जैसे केस क्लास बनाने के साथ रह सकता हूं जो मुझे करने की ज़रूरत है, यह जानने के लिए अच्छा है कि 'कंटवर्क' केस समर्थित नहीं है ... अब मैं अपने बाकी कार्य को आगे बढ़ा सकता हूं। :)। फिर से धन्यवाद, और विशेष रूप से इतनी त्वरित प्रतिक्रिया के लिए धन्यवाद, अत्यधिक सराहना की। – CaffiendFrog

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