numaralı bir kasa sınıfıyla çıkarma Son bir gün boyunca bu sitenin cevabını bulmaya çalışmak için çeşitli siteleri ve makaleleri araştırdım ve okudum ve yardımcı olan hiçbir şey bulamadım. Bunun mümkün olup olmadığından bile emin değilim. Benim sorunum, lift-json'u kullanarak bir Json Response'u ayrıştırmaya ve çıkartmaya çalışıyorum. Tepki 4 bölümden oluşuyor, ilk 3 bölüm her zaman yaptığım her talebe her cevap için aynı. Son kısım, isteğin türüne bağlı olarak değişir, ancak her zaman bazı türlerin bir listesi olacaktır. Böyle bir şey yapmak için umuyordum: Bütün elmalar ne olduğunu bilmek istiyorsa Lift-json'u bir üst sınıf
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]])
yerlerde, bunun için bir istekte bulunur ve elma listesini içeren bir yanıt geri almak. Ben bu örneği ayıklamak çalıştığınızda:
myJson.extract[Fruits[Apple]]
bu hatayı alıyorum:
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:...
Ben asansör-json 2.1 & scala 2.8 kullanıyorum. Her bir yanıt türü için özel olarak bir vaka sınıfı oluşturarak etrafta çalışmanın bir yolu var, ama yapmaya çalıştığım şeyin daha temiz olduğunu düşündüm. Sadece bu a) 'nın mümkün olup olmadığını bilmek ister miydi? b) eğer öyleyse, ne yapıyorum yanlış?
DÜZENLEME ... örnek uygulama:
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))))
Ben doesntWork eserleri gibi olmak istiyorum Nerede:
case class AFruit(aisle: Int, bin: Int, hasWhat: Option[List[Apple]])
teşekkürler! -newbie
Merhaba Joni, giriş için teşekkürler, farklı konfigürasyonlarda ve nasıl seri eserler üzerinde okumak bir yer var mı? Oldukça çalışmıyor. Mesajımı düzenledim ve bir örnekle açıklığa kavuşturdum. Elma ve portakal için olduğu gibi ipler alacağım ve işlere benzeyen bir şeyle bitirmem gerekecek. – CaffiendFrog
Merhaba, en iyi kaynaklar bu README https://github.com/lift/lift/tree/master/framework/lift-base/lift-json/ ve örnekler (* Example.scala) https://github.com kaldırma/kaldırma/ağaç/ana/çerçeve/kaldırma-tabanı/lift-json/src/test/scala/net/liftweb/json /. Bu noktada, postanızda 'çalışmıyor' vakası yapmak mümkün değildir. Gelecekte yansıma kodunu geliştirebiliriz. – Joni
Merhaba Joni, Yapmam gerekeni desteklemesi için AFruit gibi vaka sınıfları yapmakla kesinlikle yaşayabilirim, 'doesntwork' vakasının desteklenmediğini bilmek güzel ... Artık görevimin geri kalanıyla devam edebilirim. :). Tekrar teşekkürler ve özellikle bu kadar hızlı bir yanıt için teşekkürler, çok takdir. – CaffiendFrog