Scala访问另一文件中case class时jsonFormat2报类型不匹配问题
报错原因
你当前使用的是Spray JSON或兼容其API的Scala JSON序列化库,jsonFormatN系列方法要求传入case class的构造方法函数引用,你直接传入伴生对象MyData,编译器识别到的是伴生对象的独有类型MyData.type,和要求的双参数函数类型不匹配,因此抛出类型错误。
解决方法
两种写法都可以修复问题:
- 引用伴生对象自带的apply构造方法(case class默认会生成和主构造参数列表一致的apply方法,只要你没有在伴生对象里覆盖同签名的apply即可使用)
implicit val dataFormat = jsonFormat2(MyData.apply)
- 直接传入匿名构造函数引用,兼容性更好,不受自定义apply方法影响
implicit val dataFormat = jsonFormat2(new MyData(_, _))
注意事项
jsonFormat后的数字必须和case class主构造方法的参数数量完全匹配,比如3个参数就要用jsonFormat3- 如果你使用的是Play JSON、Circe等其他Scala JSON库,序列化Format的生成语法不同,但核心逻辑都是要传入构造方法的函数引用,不能直接传伴生对象本身。
内容的提问来源于stack exchange,提问作者Mandroid
相关产品推荐
相关产品推荐

