考虑这个案例类:
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 世界和打字稿中的其他地方的行为方式。例如,我可以在 Typescript 中轻松地将上面的 json 转换为这样的接口:
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))