You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Circe将Scala Case Class序列化为嵌套Map[String, Any]

解决方案

要将Case Class序列化为嵌套的Map[String, Any],你需要递归解析Circe生成的Json对象,把嵌套的Json值转换成对应的Scala类型(包括嵌套Map)。之前的方法只处理了顶层结构,所以author字段还是Json类型。

实现递归转换函数

先定义一个递归函数,将Json值转换为对应的Scala类型:

import io.circe._

def jsonToScala(json: Json): Any = json.fold(
  jsonNull = null, // 可根据需求改为Option.empty或其他空值处理方式
  jsonBoolean = identity,
  jsonNumber = num => num.toDouble.getOrElse(num.toLong.getOrElse(num)),
  jsonString = identity,
  jsonArray = arr => arr.map(jsonToScala).toList,
  jsonObject = obj => obj.toMap.mapValues(jsonToScala).toMap
)

转换Case Class为嵌套Map

用这个函数处理你的Book实例:

val book = Book("Title", 23.99, Author("Foo", "Bar"))
val json = book.asJson
val nestedMap = jsonToScala(json).asInstanceOf[Map[String, Any]]

此时nestedMap的结构如下:

Map(
  "title" -> "Title",
  "price" -> 23.99,
  "author" -> Map("firstName" -> "Foo", "lastName" -> "Bar")
)

说明

  • 递归函数会遍历Json的所有节点:JSON对象转为Map[String, Any],JSON数组转为List[Any],基本类型(字符串、布尔值、数字)直接转为对应的Scala类型。
  • 如果你的Case Class包含可选字段(Option类型),可以在函数中调整空值的处理逻辑(比如将jsonNull转为None)。

内容的提问来源于stack exchange,提问作者Forin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 07:12:18