Play-Jsonで、case classのフィールド数が22を超えると Format
オブジェクトの自動生成ができなくなる。そんなときに使えるやつ。
でも、
case class Bar(
s: String,
i: Int
)
object Bar {
implicit lazy val format: Format[Bar] = Jsonx.formatCaseClassUseDefaults[Bar]
}
このコードは Jsonx.formatCaseClassUseDefaults
に必要な暗黙パラメータがないということでエラーでる。
[error] xxx/src/main/scala/sample/Bar.scala:13:75: could not find implicit value for parameter encoder: ai.x.play.json.NameEncoder
[error] implicit lazy val format: Format[Bar] = Jsonx.formatCaseClassUseDefaults[Bar]
ちなみに、0.40.x系ではこのエラーはでない。というか NameEncoder
というトレイト自体存在しない。
とりあえずBarのコンパニオンオブジェクトに NameEncoder
型implicit変数を定義してやると
object Bar {
implicit val jsonxNameEncoder: NameEncoder = CamelToSnakeNameEncoder()
implicit lazy val format: Format[Bar] = Jsonx.formatCaseClassUseDefaults[Bar]
}
暗黙パラメータがないエラーは消えるけど、謎エラーでる。
[error] xxx/src/main/scala/sample/Bar.scala:13:75: not found: value encoder
[error] implicit lazy val format: Format[Bar] = Jsonx.formatCaseClassUseDefaults[Bar]
ここでないと言われている encoder
というのは、マクロが生成しているコード内で参照されている変数で、どうも、NameEncoder
型変数は encoder
という名前でなければいけないっぽい。ええ・・・、こんな一般的な名前の変数をスコープ内に・・・?
object Bar {
implicit val encoder: NameEncoder = CamelToSnakeNameEncoder()
implicit lazy val format: Format[Bar] = Jsonx.formatCaseClassUseDefaults[Bar]
}
いちおう、これでOK。