7

多くのメンバーを持つケース クラスがあり、そのうちの 2 つはプリミティブではありません。

import com.twitter.util.Duration
case class Foo(
  a: Int,
  b: Int,
  ...,
  y: Int,
  z: Int,
  timeoutSeconds: Duration,
  runtimeMinutes: Duration)

次の JSON をこのケース クラスのインスタンスにデシリアライズしたいと思います。

{
  "a": 1,
  "b": 2,
  // ...
  "y": 42,
  "z": 43,
  "timeoutSeconds": 30,
  "runtimeMinutes": 12,
}

通常、私はただ書くだけjson.extract[Foo]です。ただし、 とMappingExceptionのおかげで、それtimeoutSecondsは明らかruntimeMinutesです。

私はFieldSerializer、AST でのフィールド変換を可能にする を見てきました。ただし、 AST 変換しかできないため、これでは不十分です。

の拡張も検討しましたがCustomSerializer[Duration]、どの JSON キーが処理されているか (timeoutSecondsまたはruntimeMinutes) を内省する方法はありません。

を拡張することもできますが、 、、 ...、 のCustomSerializer[Foo]値を抽出するためのボイラープレート コードが多くなります。abz

PartialFunction[JField, T]理想的には、次のように書けるように、デシリアライザーとして機能するものが必要です。

{
  case ("timeoutSeconds", JInt(timeout) => timeout.seconds
  case ("runtimeMinutes", JInt(runtime) => runtime.minutes
}

残りのパラメーターについては、ケース クラスの逆シリアル化に依存します。そのような構築はjson4sで可能ですか?

これは、JSON キーに基づいて型の逆シリアル化をさらに異なるものにすることを除いて、型とフィールドのシリアライザーの結合に似ていることに注意してください。

4

1 に答える 1