我有一个包含许多成员的案例类,其中两个是非原始的:
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中可以这样构造吗?
请注意,这类似于Combining type and field serializers,除了我还希望类型反序列化根据 JSON 键而有所不同。