json - 用 JSON4 解构 JSON 数组最优雅的方法是什么?

标签 json scala json4s

我必须将以下 JSON 解构为案例类列表:

{
  "data": [
    [49, true, 14, null, null],
    [52, false, null, null, null],
    [72, true, 4, 2, 1]
  ]
}

案例类:

case class Data(i1: Int, b: Bool, i2: Option[Int], i3: Option[Int], i4: Option[Int])

我从 for comprehension 开始,但无法完成它:

for {
  JArray(data) <- json \ "data"
  JArray(d) <- data
  JInt(line) <- d.head // ???
} yield Data()

非常感谢任何帮助。

谢谢,

迈克尔

最佳答案

如果您允许包含 Rapture JSON 库,则可以按如下方式完成,仍然使用 JSON4S 后端。这需要以下导入:

import rapture.json._, jsonBackends.json4s._

如果您已经将 JSON 作为 JValue,您可以将其转换为 Rapture 的 Json 类型,如下所示:

val json = Json(jValue)

鉴于您的案例类定义,您需要为 Data 类型重新定义 JSON 提取器(已经有一个需要 JSON 对象的默认提取器),如下所示:

implicit val dataExtractor = Json.extractor[Json].map { j =>
  Data(j(0).as[Int], j(1).as[Boolean], j(2).as[Option[Int]],
      j(3).as[Option[Int]], j(4).as[Option[Int]])
}

然后您可以使用以下命令提取它:

val list = json.as[List[Data]]

关于json - 用 JSON4 解构 JSON 数组最优雅的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31009851/

相关文章:

json - 使用 for 表达式从可能为空的 JSON 值中提取选项

bash - 如何将 bash 完成与程序捆绑在一起并让它在当前 shell 中工作?

scala - 在Scala中调用带和不带括号的无参数函数以不同的方式执行

json - 在 Scala 中转换 JSON 对象的问题

javascript - 动态加载列表项并对它们进行排序,两个脚本都分开工作,但它们不能一起工作。 (包括 JSFiddle)

scala - Scala 编译器会找出 CanBuildFrom 的哪个实例?

scala - 无法让 json4s 渲染我的案例类?

javascript - 优化慢速搜索算法 - javascript、JSON 和 localstorage

json - 部分序列化结构的最佳方法是什么?

javascript - JSON 响应不是来自 php 的对象