ZIO JSON中是否需要为嵌套类单独派生Json编解码器?
解决Scala JSON编解码器嵌套结构的问题
是的,你必须为Pet定义对应的隐式编解码器——哪怕它是嵌套在Person中的类型。
DeriveJsonDecoder.gen这类推导宏确实能处理嵌套结构,但它的工作逻辑是:在生成Person的解码器时,会去当前作用域中查找Pet的隐式JsonDecoder实例。如果找不到这个实例,就会抛出你遇到的“不存在Pet的解码器”错误。
修正后的代码示例
case class Pet(name: String, numLegs: Int) case class Person(name: String, age: Int, pets: List[Pet]) // 先定义Pet的隐式编解码器 implicit val petDecoder: JsonDecoder[Pet] = DeriveJsonDecoder.gen[Pet] implicit val petEncoder: JsonEncoder[Pet] = DeriveJsonEncoder.gen[Pet] // 再生成Person的编解码器 implicit val decoder: JsonDecoder[Person] = DeriveJsonDecoder.gen[Person] implicit val encoder: JsonEncoder[Person] = DeriveJsonEncoder.gen[Person] println( someJson.fromJson[Person] )
另一种紧凑写法
如果希望把Pet和Person的定义绑定得更紧密,可以把Pet放在Person的伴生对象里,这样宏会自动在伴生对象中查找Pet的编解码器:
case class Person(name: String, age: Int, pets: List[Person.Pet]) object Person { case class Pet(name: String, numLegs: Int) // 在伴生对象内定义Pet的编解码器 implicit val petDecoder: JsonDecoder[Pet] = DeriveJsonDecoder.gen[Pet] implicit val petEncoder: JsonEncoder[Pet] = DeriveJsonEncoder.gen[Pet] } // 生成Person的编解码器时会自动找到伴生对象里的Pet编解码器 implicit val decoder: JsonDecoder[Person] = DeriveJsonDecoder.gen[Person] implicit val encoder: JsonEncoder[Person] = DeriveJsonEncoder.gen[Person] println( someJson.fromJson[Person] )
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

