用选项将json打成一个case类

时间:2018-01-14 08:22:51

标签: scala.js play-json upickle

考虑这个案例类:

case class Sample(status: String, message: Option[String])

Sample(status="OK")由play-json序列化为JSON为

{
   "status":"OK"
}

Sample(status="OK", message=Some("message content"))

{
   "status":"OK",
   "message":"message content"
}

这是可选字段在Play和JS世界和打字稿中的其他地方的行为方式。例如,我可以轻松地将上面的json转换为这样的接口:Typescript:

interface Sample {
    status: string;
    message?: string;
}

const sample: Sample = { status: "OK" } as Sample;

现在我明白有一些酸洗概念以一致的方式序列化/反序列化。然而,有趣的是,没有酸洗库可以轻松地支持这种反序列化到案例类中。也许我错过了什么......有什么建议吗?

更新 - 这是我想要观察的行为

json:

{ "status": "OK" }  

变为:

Sample("OK",None)

json:

{ "status": "OK", "message": "message content" }  

变为:

Sample("OK",Some("message content"))

是的,确实以下代码可以实现这一点。但我不想在许多不同的地方明确指出这种区别。

import upickle.default.Reader

case class Sample(status: String, message: Option[String])

implicit def r: Reader[Sample] = Reader[Sample] {
  case (x:upickle.Js.Value) =>
    Sample (
      status   = x.obj.get("status").get.toString(),
      message  = x.obj.get("message").flatMap(x => Some(x.toString))
    )
}

upickle.default.readJs[Sample](upickle.json.read(jsonText))

0 个答案:

没有答案