0

次のケース クラスを検討してください。

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 を 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))
4

0 に答える 0