多くのメンバーを持つケース クラスがあり、そのうちの 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]
値を抽出するためのボイラープレート コードが多くなります。a
b
z
PartialFunction[JField, T]
理想的には、次のように書けるように、デシリアライザーとして機能するものが必要です。
{
case ("timeoutSeconds", JInt(timeout) => timeout.seconds
case ("runtimeMinutes", JInt(runtime) => runtime.minutes
}
残りのパラメーターについては、ケース クラスの逆シリアル化に依存します。そのような構築はjson4sで可能ですか?
これは、JSON キーに基づいて型の逆シリアル化をさらに異なるものにすることを除いて、型とフィールドのシリアライザーの結合に似ていることに注意してください。