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か、という状況を想定しているときに使うと良さそう。