使用Spray Json解析超过22个字段而没有嵌套案例类

时间:2018-12-10 21:22:39

标签: scala spray-json

我正在尝试使用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]

        }
    }

1 个答案:

答案 0 :(得分:1)

您可以按照here的说明实施RootJsonFormat来解决Tupple22Function22的局限性。案例类中的22参数不再受限制(带有警告),因此您可以使类结构保持平坦。在实现RootJsonFormat时,您甚至不必使用case类作为目标反序列化类型,它可以是常规类。

请注意,即使您可以将JSON解析为case类,也可能在代码中遇到22的其他限制。有关说明,请参见this。 例如,您获得了case类,现在想将其保存到DB,并且如果没有自定义序列化程序,您的DB框架将无法解决22参数限制。在这种情况下,转换为嵌套案例类可能会更简单。

在Dotty中,限制22完全是gone,但这需要一些时间:

  

函数类型的最大参数数限制为22   已被删除。函数现在可以具有任意数量的   参数。 Function22以外的功能用新的表示   特质scala.FunctionXXL。

     

元组大小的上限22将被删除。元组   将来将由类似HList的结构表示   任意大。