json4s:使用自定义序列化程序反序列化特定字段

ken*_*ose 7 json scala case-class json4s

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

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

我想将以下JSON反序列化为此case类的实例:

{
  "a": 1,
  "b": 2,
  // ...
  "y": 42,
  "z": 43,
  "timeoutSeconds": 30,
  "runtimeMinutes": 12,
}
Run Code Online (Sandbox Code Playgroud)

通常,我会写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
}
Run Code Online (Sandbox Code Playgroud)

并依赖于案例类反序列化其余参数.这种结构在json4s中是否可行?

请注意,这类似于组合类型和字段序列化程序,除了我还希望类型反序列化基于JSON键而不同.

小智 0

使用Json.NET

string json = @"{
Run Code Online (Sandbox Code Playgroud)

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

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

Response.Write(bsObj.Name);  
Run Code Online (Sandbox Code Playgroud)