跳到主要内容

高效编码:JSON To Scala Case Classes — Numio

把 JSON 示例转换为 Scala case class。嵌套对象变为独立的 case class,数组变为 Seq[...];null 值和数组中部分元素缺少的键变为 Option[...]。

在加入 Circe、Play JSON 或 uPickle 编解码器之前,先起草 JSON API 的模型。

JSON

Scala Case Class

适用场景

  • 在加入 Circe、Play JSON 或 uPickle 编解码器之前,先起草 JSON API 的模型。
  • 把 Kafka 或 HTTP 示例载荷转换为 Spark 或 Akka 作业使用的 case class。

使用方法

  1. 粘贴 JSON 对象;对于可选字段,请包含多个键不同的数组元素。
  2. 检查输出:根类名为 RootInterface,嵌套类按键名的 PascalCase 命名(speakers 变为 Speakers)。
  3. 复制这些类并重命名,把示例无法确定类型的 Option[Any] 或 Seq[Any] 改为具体类型。

JSON 输入

{
  "id": 7,
  "type": "conference",
  "price": 49.9,
  "venue": null,
  "tags": ["jvm", "fp"],
  "speakers": [
    { "name": "Martin", "talk": "Keynote" },
    { "name": "Li", "talk": "Effects", "slides": "https://example.com/s.pdf" }
  ]
}

Scala case class

case class RootInterface(
  id: Int,
  `type`: String,
  price: Double,
  venue: Option[Any],
  tags: Seq[String],
  speakers: Seq[Speakers]
)

case class Speakers(
  name: String,
  talk: String,
  slides: Option[String]
)

功能与限制

在浏览器中由本站自己的生成器运行,不调用服务器。此页面没有设置项,也不会添加 import 或编解码器派生。

数组的所有元素会被合并:在部分元素中缺失或为 null 的键变为 Option[...],12 与 1.5 同时出现时变为 Double。

始终为 null 的值得到 Option[Any],空数组得到 Seq[Any],因为示例中没有可推断的类型。

保留字和不是合法标识符的键会用反引号包裹,例如 `type`;snake_case 键保持原样。

FAQ

可空字段会生成 Option 吗?

会。值为 null 的键变为 Option[...];如果该键在其他示例中有实际值,就按那些值确定类型,否则为 Option[Any]。数组中部分元素缺少的键也是 Option。

根节点为 JSON 数组时会怎样?

其元素会合并为一个 RootInterface case class,部分元素缺少的键为 Option,并添加 type RootInterfaceList = Seq[RootInterface]。

64 位 ID 会被定为 Long 吗?

只有当示例值超出 Int 范围(约 ±21 亿)时才会。其他整数变为 Int,因此可能增长的 ID 或时间戳请改为 Long。

规范与参考资料