如何使用Spray Json将Scala的Seq[Seq[Any]]转换为JSON?
解决Spray Json序列化Seq[Seq[Any]]的问题
嘿,我明白你遇到的麻烦了!Spray Json报错的核心原因是它不知道怎么处理Any类型——毕竟Any可以指代任何数据,没有默认的序列化规则。不过别担心,我们只需要先把所有元素转换成String,就能让Spray Json顺利工作了。
具体步骤和代码示例
首先先修正你代码里的一个小细节:Scala里创建序列要用Seq(...),而不是像Java那样用[]。然后我们把嵌套序列里的每个元素都转成String,再进行序列化:
import spray.json._ import DefaultJsonProtocol._ // 你的原始序列 val originalSeq: Seq[Seq[Any]] = Seq( Seq("abc", 123, false, null), Seq("def", 45, "1234", 'C') ) // 将每个元素转换为String(显式处理null会让逻辑更清晰,其实null.toString本身就是"null") val stringifiedSeq: Seq[Seq[String]] = originalSeq.map { innerList => innerList.map { case null => "null" case element => element.toString } } // 现在可以正常序列化了 val jsonOutput = stringifiedSeq.toJson // 打印紧凑格式的结果,就是你想要的样子 println(jsonOutput.compactPrint)
为什么这样能行?
Spray Json的DefaultJsonProtocol已经为Seq[String]提供了默认的序列化规则——它知道怎么把字符串序列成JSON字符串,把序列序列成JSON数组。当我们把Seq[Seq[Any]]转换成Seq[Seq[String]]后,就完全符合Spray Json能处理的类型范围了。
刚好你的需求里,每个元素的toString()结果就是你想要的JSON值:
- 数字
123→"123" - 布尔值
false→"false" null→"null"- 字符
'C'→"C"
完美匹配你要的输出格式!
内容的提问来源于stack exchange,提问作者ben
相关产品推荐
相关产品推荐

