String の代わりに CharSequence を使用するクラスのシリアル化に問題があります。Strings を使用すると、すべて正常に動作します。
私は次のクラスを持っています:
case class Word(word: CharSequence,
meanings: Traversable[CharSequence],
readings: Traversable[CharSequence]) {
}
そのようにシリアル化しようとすると:
...
val word = new Word("dog", List("Foo", "Goo"), List("Ba", "Fa"))
implicit val wordWrites = Json.writes[Word]
Ok(Json.toJson(word)).as(JSON)
次のエラーが表示されます。
error: exception during macro expansion:
scala.reflect.macros.TypecheckException: No implicit Writes for CharSequence, Traversable[CharSequence], Traversable[CharSequence] available.
at scala.reflect.macros.runtime.Typers$class.inferImplicit(Typers.scala:55)
at scala.reflect.macros.runtime.Typers$class.inferImplicitValue(Typers.scala:38)
at scala.reflect.macros.runtime.Context.inferImplicitValue(Context.scala:6)
at scala.reflect.macros.runtime.Context.inferImplicitValue(Context.scala:6)
at play.api.libs.json.JsMacroImpl$$anonfun$15.apply(JsMacroImpl.scala:332)
at play.api.libs.json.JsMacroImpl$$anonfun$15.apply(JsMacroImpl.scala:317)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
at scala.collection.immutable.List.foreach(List.scala:309)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
at scala.collection.AbstractTraversable.map(Traversable.scala:105)
at play.api.libs.json.JsMacroImpl$.writesImpl(JsMacroImpl.scala:317)
implicit val wordWrites = Json.writes[Word]
シリアライゼーション フレームワークの作成者は、おそらく CharSequence をサポートするのを忘れていたことを理解しています。ただし、すべての CharSequence インスタンスで .toString() を呼び出すための賢明なデフォルトをシリアライザーに与えるにはどうすればよいでしょうか?