使用 Lift,我正在尝试“提取”(获取案例类表示)我的 JSON。
val json: JValue = getJson()
case class BigObj(name: String, age: Int, ...)
json.extract[BigObj]
当使用超过 22 个参数时,我得到一个 JVM 运行时异常,即案例类不能超过 22 个参数。
我该如何解决这个限制?
使用 Lift,我正在尝试“提取”(获取案例类表示)我的 JSON。
val json: JValue = getJson()
case class BigObj(name: String, age: Int, ...)
json.extract[BigObj]
当使用超过 22 个参数时,我得到一个 JVM 运行时异常,即案例类不能超过 22 个参数。
我该如何解决这个限制?
如前所述,您无法通过案例类显式克服该限制,但是您可以在没有案例类的情况下使用提取方法。请参阅此示例,我通过 REPL 运行以验证:
scala> import net.liftweb.json._
import net.liftweb.json._
scala> implicit val formats = net.liftweb.json.DefaultFormats
formats: net.liftweb.json.DefaultFormats.type = net.liftweb.json.DefaultFormats$@734784c4
scala> val json = parse(""" {
| "v1": "Test1",
| "v2": "Test2",
| "v3": "Test3",
| "v4": "Test4",
| "v5": "Test5",
| "v6": "Test6",
| "v7": "Test7",
| "v8": "Test8",
| "v9": "Test9",
| "v10": "Test10",
| "v11": "Test11",
| "v12": "Test12",
| "v13": "Test13",
| "v14": "Test14",
| "v15": "Test15",
| "v16": "Test16",
| "v17": "Test17",
| "v18": "Test18",
| "v19": "Test19",
| "v20": "Test20",
| "v21": "Test21",
| "v22": "Test22",
| "v23": "Test23"
| } """)
json: net.liftweb.json.JValue = JObject(List(JField(v1,JString(Test1)), JField(v2,JString(Test2)), JField(v3,JString(Test3)), JField(v4,JString(Test4)), JField(v5,JString(Test5)), JField(v6,JString(Test6)), JField(v7,JString(Test7)), JField(v8,JString(Test8)), JField(v9,JString(Test9)), JField(v10,JString(Test10)), JField(v11,JString(Test11)), JField(v12,JString(Test12)), JField(v13,JString(Test13)), JField(v14,JString(Test14)), JField(v15,JString(Test15)), JField(v16,JString(Test16)), JField(v17,JString(Test17)), JField(v18,JString(Test18)), JField(v19,JString(Test19)), JField(v20,JString(Test20)), JField(v21,JString(Test21)), JField(v22,JString(Test22)), JField(v23,JString(Test23))))
scala> class MyLargeArgClass(val v1:String, val v2:String, val v3:String, val v4:String, val v5:String, val v6:String, val v7:String, val v8:String, val v9:String, val v10:String, val v11:String, val v12:String, val v13:String, val v14:String, val v15:String, val v16:String, val v17:String, val v18:String, val v19:String, val v20:String, val v21:String, val v22:String, val v23:String) {
|
| override def toString = "MyLargeArgClass(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)".format(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23)
|
| }
defined class MyLargeArgClass
scala> json.extract[MyLargeArgClass]
res0: MyLargeArgClass = MyLargeArgClass(Test1, Test2, Test3, Test4, Test5, Test6, Test7, Test8, Test9, Test10, Test11, Test12, Test13, Test14, Test15, Test16, Test17, Test18, Test19, Test20, Test21, Test22, Test23)
然后从课堂回到 JSON
scala> Extraction.decompose(res0)
res1: net.liftweb.json.JValue = JObject(List(JField(v1,JString(Test1)), JField(v2,JString(Test2)), JField(v3,JString(Test3)), JField(v4,JString(Test4)), JField(v5,JString(Test5)), JField(v6,JString(Test6)), JField(v7,JString(Test7)), JField(v8,JString(Test8)), JField(v9,JString(Test9)), JField(v10,JString(Test10)), JField(v11,JString(Test11)), JField(v12,JString(Test12)), JField(v13,JString(Test13)), JField(v14,JString(Test14)), JField(v15,JString(Test15)), JField(v16,JString(Test16)), JField(v17,JString(Test17)), JField(v18,JString(Test18)), JField(v19,JString(Test19)), JField(v20,JString(Test20)), JField(v21,JString(Test21)), JField(v22,JString(Test22)), JField(v23,JString(Test23))))
没有必要覆盖toString
- 我只需要查看添加了哪些数据。但是,由于这不是case class
,因此您将丢失一些附带的自动方法。因此,如果您需要将其放入 HTTP 会话中,您可能需要实现Serializable
. 对于模式匹配,您需要一个unapply
方法等...
您还应该能够使用formats
自己的附加规则来从 JSON 中解析和提取数据。
案例类、元组等无法绕过 22 个限制。这是 Scala 的限制。但是,如果您可以处理常规课程,那么您当然可以这样做。您只是不会免费获得匹配的, equals
,hashCode
等。