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

Scala PlayFramework:如何从case class列表批量生成Json.Reads/Writes

你给出的示例代码无法直接运行,因为Json.reads[T]是Play Json提供的编译期宏,要求类型参数T必须是编译时就能确定的具体case class类型,而你代码中的clazz是运行时才拿到的Class对象,无法作为编译期的类型参数传入宏,因此你写的写法在编译阶段就会报错。

下面是可行的替代方案:

方案1:使用Play Json官方自动派生(无侵入,无需修改现有代码)

Play Json 2.7+ 官方提供了派生扩展,可以自动为所有case class生成序列化/反序列化实例,不需要手动逐个声明:

  • 非Play项目先在build.sbt中添加依赖,Play项目无需额外引入:
libraryDependencies += "com.typesafe.play" %% "play-json-derived-codecs" % "10.1.0"
  • 在需要使用Json能力的作用域导入派生规则即可:
import play.api.libs.json._
import derived._

// 直接使用即可,不需要提前为CaseClassOne、CaseClassTwo声明reads/writes
val json = Json.toJson(CaseClassOne("test", 1))
val parsedObj = Json.parse(json.toString()).as[CaseClassOne]

方案2:批量生成集中管理的隐式实例

如果你需要把所有case class的序列化实例集中管理,可以通过Scala自定义宏实现批量生成,适合case class数量极多、需要统一配置序列化规则的场景,不过自定义宏的开发成本较高,普通小项目不推荐。

方案3:切换为自带自动序列化的Json库

如果可以调整技术选型,推荐使用uPickle这类默认支持case class全自动序列化的库,完全不需要手动声明任何读写规则:

import upickle.default._

// 开箱即用,无需任何提前配置
val jsonStr = write(CaseClassOne("test", 1))
val obj = read[CaseClassOne](jsonStr)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:54:07