2

次のようなクラスがあるとしましょう。

abstract class SomeSuperClass(name: String)
case class SomeClass(someString: String, opt: Option[String]) extends SomeSuperClass("someName")

nameこのクラスをシリアル化し、フィールドを追加できるようにしたいのですが、これが私の最初のアプローチでした:

implicit def serialize: Writes[SomeClass] = new Writes[SomeClass] {
  override def writes(o: SomeClass): JsValue = Json.obj(
    "someString" -> o.someString,
    "opt" -> o.opt,
    "name" -> o.name
  )
}

nullこれは がある場合に返されるため、ドキュメントに従ってNone実装を次のように変更しました。

implicit def serialize: Writes[SomeClass] = (
  (JsPath \ "someString").write[String] and
  (JsPath \ "opt").writeNullable[String] and
  (JsPath \ "name").write[String]
)(unlift(SomeClass.unapply))

これはコンパイルされません。名前フィールドを削除した場合にのみ機能します。

[error]   [B](f: B => (String, Option[String], String))(implicit fu: play.api.libs.functional.ContravariantFunctor[play.api.libs.json.OWrites])play.api.libs.json.OWrites[B] <and>
[error]   [B](f: (String, Option[String], String) => B)(implicit fu: play.api.libs.functional.Functor[play.api.libs.json.OWrites])play.api.libs.json.OWrites[B]
[error]  cannot be applied to (api.babylon.bridge.messaging.Command.SomeClass => (String, Option[String]))
[error]       (JsPath \ "opt").writeNullable[String] and

ケースクラスに厳密には存在せず、オプションのフィールドを持つフィールドを追加するにはどうすればよいですか?

play-json 2.3.0 を使用しています。

4

1 に答える 1