Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 电梯案例类别超过22个参数_Scala_Lift_Case Class - Fatal编程技术网

Scala 电梯案例类别超过22个参数

Scala 电梯案例类别超过22个参数,scala,lift,case-class,Scala,Lift,Case Class,使用Lift,我试图“提取”(获取JSON的case类表示) 当使用超过22个参数时,我得到一个JVM运行时异常,即case类不能超过22个参数 如何绕过这个限制?case类、元组等无法绕过22个限制。这是Scala的限制。然而,如果你能应付一个普通的课程,那么你当然可以做到这一点。您不会免费获得匹配、等于、哈希码等。正如前面提到的,您无法用case类显式地克服这一限制,但是您可以在没有case类的情况下使用extract方法。请参阅此示例,我通过REPL运行此示例以验证: scala>

使用Lift,我试图“提取”(获取JSON的case类表示)

当使用超过22个参数时,我得到一个JVM运行时异常,即case类不能超过22个参数


如何绕过这个限制?

case类、元组等无法绕过22个限制。这是Scala的限制。然而,如果你能应付一个普通的课程,那么你当然可以做到这一点。您不会免费获得匹配、
等于、
哈希码等。

正如前面提到的,您无法用case类显式地克服这一限制,但是您可以在没有case类的情况下使用extract方法。请参阅此示例,我通过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
——我只需要查看添加了哪些数据。但是,由于这不是一个
案例类
,因此您将丢失它附带的一些自动方法。因此,如果需要将其放入HTTP会话中,则可能需要实现
Serializable
。对于模式匹配,您需要一个
unapply
方法,等等


您还应该能够使用
格式
来指定自己的附加规则,以便从JSON解析和提取数据

恕我直言,我正在努力解决这个问题,仅针对Lift。scala 2.11中的22个参数限制似乎正在消失-例如,参见
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))))