我正在尝试使用Spray-JSON将具有超过22个字段的传入JSON编组。由于没有JsonFormat23()方法,因此我必须嵌套我的case类来解决此限制。但是,传入的JSON不知道嵌套结构。
有没有办法避免在Spray Json中使用嵌套结构?
编辑
这是我的解决办法,这样其他人就不会有同样的痛苦。我的问题之一是我所有的字段都是可选的,这又增加了另一层复杂性。您可以在此解决方案中随意放置多个字段
implicit object myFormat extends RootJsonFormat[myFormat] {
override def write(js : myFormat):JsValue =
JsObject(
List(
Some("language" -> js.language.toJson),
Some("author" -> js.author.toJson),
....
).flatten: _*
)
override def read(json: JsValue):myFormat= {
val fieldNames = Array("language", ... , "author")
val jsObject = json.asJsObject
jsObject.getFields(fieldNames:_*)
// code to transform fields to case class
// Initializes class with list of parameters
myFormat.getClass.getMethods.find(x => x.getName == "apply" && x.isBridge)
.get.invoke(myFormat, mylist map (_.asInstanceOf[AnyRef]): _*).asInstanceOf[myFormat]
}
}
答案 0 :(得分:1)
您可以按照here的说明实施RootJsonFormat
来解决Tupple22
和Function22
的局限性。案例类中的22
参数不再受限制(带有警告),因此您可以使类结构保持平坦。在实现RootJsonFormat
时,您甚至不必使用case类作为目标反序列化类型,它可以是常规类。
请注意,即使您可以将JSON解析为case类,也可能在代码中遇到22
的其他限制。有关说明,请参见this。
例如,您获得了case类,现在想将其保存到DB,并且如果没有自定义序列化程序,您的DB框架将无法解决22
参数限制。在这种情况下,转换为嵌套案例类可能会更简单。
在Dotty中,限制22完全是gone,但这需要一些时间:
函数类型的最大参数数限制为22 已被删除。函数现在可以具有任意数量的 参数。 Function22以外的功能用新的表示 特质scala.FunctionXXL。
元组大小的上限22将被删除。元组 将来将由类似HList的结构表示 任意大。