此代码有效:
import net.liftweb.json.{DefaultFormats, parse}
object JsonTest {
def main(args: Array[String]): Unit = {
implicit val formats = DefaultFormats // Brings in default date formats etc.
case class RawObject(filters: List[ChunkObject])
case class ChunkObject(name: String)
val json = parse("""{"filters": []}""").extract[RawObject]
println(json)
}
}
它打印:
RawObject(List())
类中的相同代码不会:
import net.liftweb.json.{DefaultFormats, parse}
class JsonTest2 {
def fct(): Unit = {
implicit val formats = DefaultFormats // Brings in default date formats etc.
case class RawObject(filters: List[ChunkObject])
case class ChunkObject(name: String)
val json = parse("""{"filters": []}""").extract[RawObject]
println(json)
}
}
object JsonTest2 {
def main(args: Array[String]): Unit = {
val jt = new JsonTest2
jt.fct()
}
}
错误:
Exception in thread "main" net.liftweb.json.MappingException: Parsed JSON values do not match with class constructor
args=List()
arg types=scala.collection.immutable.Nil$
constructor=public JsonTest2$RawObject$1(JsonTest2,scala.collection.immutable.List)
at net.liftweb.json.Meta$.fail(Meta.scala:227)
at net.liftweb.json.Extraction$.instantiate$1(Extraction.scala:274)
at net.liftweb.json.Extraction$.newInstance$1(Extraction.scala:308)
at net.liftweb.json.Extraction$.build$1(Extraction.scala:379)
at net.liftweb.json.Extraction$.extract0(Extraction.scala:444)
at net.liftweb.json.Extraction$.extract0(Extraction.scala:206)
at net.liftweb.json.Extraction$.extract(Extraction.scala:43)
at net.liftweb.json.JsonAST$JValue.extract(JsonAST.scala:703)
at JsonTest2.fct(JsonTest2.scala:9)
at JsonTest2$.main(JsonTest2.scala:17)
at JsonTest2.main(JsonTest2.scala)
Caused by: java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at net.liftweb.json.Extraction$.instantiate$1(Extraction.scala:265)
... 9 more
我错过了什么?
PS:使用一个简单的json(只有一个带有字符串值的字段,所以里面没有List(,它可以在Object和Class 中工作
编辑:我认为这与函数内部的case类定义有关,但我不明白为什么。
从错误消息的外观来看,RawObject
的构造函数似乎采用了liftweb不期望的额外参数:
构造函数=公共JsonTest2$RawObject$1(JsonTest2,scala.collection.invariable.List(
RawObject
是一个嵌套类型,在Scala中,嵌套类型对于包含对象的每个实例都是唯一的。因此,JsonTest2
的一个实例内的RawObject
与JsonTest2
的另一个实例中的RawObject
的类型不同。
我猜Scala将包含类型(JsonTest2
(的实例放在嵌套类型(RawObject
(中,这样它就可以在运行时确定类型。因此,CCD_ 9参数为CCD_ 10的构造函数。
因此,将RawObject
和ChunkObject
移出JsonTest2
类将解决该问题。这些可以放在配套的物体中,以保持物品整洁。