के साथ एक केस क्लास में लिफ्ट-जेसन निकालने के लिए मैंने पिछले दिन इस साइट के उत्तर को खोजने का प्रयास करने के लिए विभिन्न साइटों और लेखों को खोज और पढ़ा है और मुझे कुछ भी मदद नहीं मिली है। मुझे यह भी यकीन नहीं है कि यह संभव है या नहीं। मेरी समस्या यह है कि मैं लिफ्ट-जेसन का उपयोग करके एक जेसन प्रतिक्रिया का विश्लेषण और निकालने की कोशिश कर रहा हूं। प्रतिक्रिया में 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
हाय जोनी, आपके इनपुट के लिए धन्यवाद, वहाँ कहीं भी मैं अलग विन्यास और कैसे काम करता है क्रमबद्धता पर पढ़ सकते हैं? यह काफी काम नहीं करता है। मैंने अपनी पोस्ट संपादित की और एक उदाहरण के साथ स्पष्ट किया। मुझे सेब और संतरे के लिए तार मिलेंगे और मुझे कामों की तरह कुछ खत्म करने की ज़रूरत है। – CaffiendFrog
हाय, सर्वोत्तम संसाधन इस रीडमे https://github.com/lift/lift/tree/master/framework/lift-base/lift-json/ और उदाहरण (* example.scala) https://github.com में हैं/लिफ्ट/लिफ्ट/पेड़/मास्टर/फ्रेमवर्क/लिफ्ट-बेस/लिफ्ट-जेसन/src/test/scala/net/liftweb/json /। इस बिंदु पर आपके पोस्ट में काम करने में 'नहीं है' कार्य करना संभव नहीं है। यह हो सकता है कि हम भविष्य में प्रतिबिंब कोड को बेहतर बना सकते हैं। – Joni
हाय जोनी, मैं निश्चित रूप से एफ़्रूट जैसे केस क्लास बनाने के साथ रह सकता हूं जो मुझे करने की ज़रूरत है, यह जानने के लिए अच्छा है कि 'कंटवर्क' केस समर्थित नहीं है ... अब मैं अपने बाकी कार्य को आगे बढ़ा सकता हूं। :)। फिर से धन्यवाद, और विशेष रूप से इतनी त्वरित प्रतिक्रिया के लिए धन्यवाद, अत्यधिक सराहना की। – CaffiendFrog