如何使用Spray Json将Scala样例类对象转换为JSON字符串
使用Spray Json将Scala样例类转换为JSON字符串
1. 添加依赖
先在你的SBT构建文件里添加Spray Json的依赖(根据Scala版本调整,以下是Scala 2.13的示例版本):
libraryDependencies += "io.spray" %% "spray-json" % "1.3.6"
2. 导入核心包
在代码里导入Spray Json的核心类和默认协议:
import spray.json._ import DefaultJsonProtocol._
3. 为样例类定义JSON格式
Spray Json需要隐式的JsonFormat实例来处理自定义样例类,我们可以用DefaultJsonProtocol提供的宏自动生成:
// 先定义Address的格式,因为DriverDetails依赖它 implicit val addressFormat: RootJsonFormat[Address] = jsonFormat4(Address) // 再定义DriverDetails的格式,注意字段顺序要和样例类定义完全一致 implicit val driverDetailsFormat: RootJsonFormat[DriverDetails] = jsonFormat5(DriverDetails)
说明:
jsonFormatN里的数字N对应样例类的字段数量,Address有4个字段用jsonFormat4,DriverDetails有5个字段用jsonFormat5。
4. 转换样例类对象为JSON字符串
创建DriverDetails实例后,直接调用toJson方法,再转成字符串即可:
// 创建Address实例 val address = Address(Some("Main St"), "New York", "NY", List("123-456-7890", "098-765-4321")) // 创建DriverDetails实例 val driver = DriverDetails( userId = "driver_001", names = Some(List("John", "Doe")), addresses = Some(List(address)), invalidData = Some(Map("error" -> Map("field1" -> List("invalid format", "too short")))), vehicleIds = List("veh_100", "veh_101") ) // 转换为格式化后的JSON字符串 val jsonString = driver.toJson.prettyPrint // 打印结果 println(jsonString)
输出示例
运行后会得到如下格式化的JSON:
{ "userId": "driver_001", "names": [ "John", "Doe" ], "addresses": [ { "street": "Main St", "city": "New York", "state": "NY", "contactNumbers": [ "123-456-7890", "098-765-4321" ] } ], "invalidData": { "error": { "field1": [ "invalid format", "too short" ] } }, "vehicleIds": [ "veh_100", "veh_101" ] }
注意事项
- 如果样例类中的
Option字段值为None,转换后的JSON会自动忽略该字段,不会输出null。 - 必须保证
jsonFormatN的字段顺序和样例类定义的顺序完全一致,否则会出现字段映射错误。
内容的提问来源于stack exchange,提问作者bugdebug
相关产品推荐
相关产品推荐

