【问题标题】:Play Framework Scala format large JSON (No unapply or unapplySeq function found)Play Framework Scala 格式大 JSON(未找到 unapply 或 unapplySeq 函数)
【发布时间】:2016-05-24 10:39:01
【问题描述】:

我需要在我的服务器上接收一个大的 JSON(超过 22 个字段)。 我有一个包含很多字段的案例类:

case class Filters(objectType: Option[String] = None,
     deal: Option[String] = None,
     roomsCount: Option[String] = None,
     region: Option[Int] = None,
     district: Option[Int] = None,
     direction: Option[Int] = None
     ...
)

以及控制器中的JSON格式函数:

implicit val filtersFormat = Json.format[Filters]

编译时出现错误:

[error] WebSockets.scala:18: No unapply or unapplySeq function found
[error]   implicit val filtersFormat = Json.format[Filters]
[error]                                          ^

有没有办法在不将 JSON 分解成小部分的情况下解决问题?

【问题讨论】:

  • 拆分case class,让apply 函数创建一个嵌套的case class 结构。
  • 在不破坏案例类的情况下这是不可能的。我的 json 有 100 多个字段,我已经将它分成 5 个案例类,进一步嵌套它会使我的业务逻辑过于复杂。

标签: json scala playframework


【解决方案1】:

正如@Sawyer 所说,您可以使用external library。取自this blog

首先将 lib 依赖添加到你的 SBT

libraryDependencies += "ai.x" %% "play-json-extensions" % "0.42.0"

那么你可以这样使用它:

import ai.x.play.json.Jsonx
import play.api.libs.json.{Json, OFormat}

case class Foo(a1: String, a2: String, a3: String, a4: String, a5: String,
               a6: String, a7: String, a8: String, a9: String, a10: String,
               a11: String, a12: String, a13: String, a14: String, a15: String,
               a16: String, a17: String, a18: String, a19: String, a20: String,
               a21: String, a22: String, a23: String)

object Foo {
  implicit val f: OFormat[Foo] = Jsonx.formatCaseClass[Foo]
}

【讨论】:

    【解决方案2】:

    我是这样做的:

    case class Filters(part1: Part1, part2: Part2, ...)
    
    case class Part1(
        field1: Field1,
        field2: Field2,
        ...
        field10: Field10,
    )
    
    object Part1 {
        implicit val part1Format = Json.format[Part1]
    }
    
    ...
    
    object Filters {
        implicit val filtersReads = (
            JsPath.read[Part1] and
            JsPath.read[Part2] and
            ...
        )(Filters.apply _)
    
        implicit val filtersWrites = (
            JsPath.write[Part1] and
            JsPath.write[Part2] and
            ...
        )(unlift(Filters.unapply))
    }
    

    【讨论】:

    • 根据问题,请不要分成小部分。
    【解决方案3】:

    我有相同的 pb 并通过使用找到解决方案

    Jsonx.formatCaseClass[Filters]
    

    可以找到解释 https://harrylaou.com/playframework/bigjson/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      • 2016-01-23
      • 2021-01-30
      • 2013-01-06
      • 1970-01-01
      • 2019-06-23
      • 2013-01-24
      相关资源
      最近更新 更多