Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

ScalaのupickleでオプショナルなフィールドをパースするにはNone defautを設定しておくと良い

tl;dr

deserialize serialize
デフォルト値がある フィールドがない場合はデフォルト値にフォールバックする 値がデフォルトと同じならフィールドごと削除する
デフォルト値がない フィールドがない場合は例外を投げる 値をセットする
//> using dep com.lihaoyi::upickle::4.4.1

import upickle.default._

case class Person(
    name: String,
    age: Int,
    email: Option[String] = None,
    address: Option[String] = None,
    phone: Option[String] = None
)

object Person {
  implicit val rw: ReadWriter[Person] = macroRW
}

こんな感じに設定しておくと、

{ "name": "windymelt", "age": 32 }

こういうJSONをパースできるようになります。存在しないフィールドはNoneにフォールバックします。

//> using dep com.lihaoyi::upickle::4.4.1

import upickle.default._

case class Person(
    name: String,
    age: Int,
    email: Option[String],
    address: Option[String],
    phone: Option[String]
)

object Person {
  implicit val rw: ReadWriter[Person] = macroRW
}

このようにdefault parameterを設定していないと、

Caused by: upickle.core.Abort: missing keys in dictionary: email, address, phone

例外を吐いてしまいます。

default parameterを指定しないときは、値があるかnullか、という状況を想定しているときに使うと良さそう。

参考文献

stackoverflow.com

com-lihaoyi.github.io

★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?