7

我有一个包含许多成员的案例类,其中两个是非原始的:

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 密钥(timeoutSecondsruntimeMinutes)。

我也可以尝试扩展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 键而有所不同。

4

1 回答 1

0

使用 Json.NET

string json = @"{

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

BlogSites bsObj = JsonConvert.DeserializeObject<BlogSites>(json);  

Response.Write(bsObj.Name);  
于 2020-04-03T17:42:51.110 回答