Распаковка json в класс case с опцией

Рассмотрим этот случай класса:

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 и в других местах мира и машинописи. Например, я могу легко привести приведенный выше 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 ответов

Другие вопросы по тегам