如何基于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
相关产品推荐
相关产品推荐

