aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/DerivedFormats.scala7
-rw-r--r--src/test/scala/ProductTypeFormatTests.scala17
2 files changed, 23 insertions, 1 deletions
diff --git a/src/main/scala/DerivedFormats.scala b/src/main/scala/DerivedFormats.scala
index d0cac38..5bba08a 100644
--- a/src/main/scala/DerivedFormats.scala
+++ b/src/main/scala/DerivedFormats.scala
@@ -24,7 +24,12 @@ trait DerivedFormats { self: BasicFormats =>
ctx.rawConstruct(Seq.empty)
} else {
ctx.construct { param =>
- param.typeclass.read(obj.fields(param.label))
+ val fieldValue = if (param.isOption) {
+ obj.fields.getOrElse(param.label, JsNull)
+ } else {
+ obj.fields(param.label)
+ }
+ param.typeclass.read(fieldValue)
}
}
case js =>
diff --git a/src/test/scala/ProductTypeFormatTests.scala b/src/test/scala/ProductTypeFormatTests.scala
index ce05000..d602ff4 100644
--- a/src/test/scala/ProductTypeFormatTests.scala
+++ b/src/test/scala/ProductTypeFormatTests.scala
@@ -74,4 +74,21 @@ class ProductTypeFormatTests
"""{"h": {"x":true}}"""
)
+ case class Opt(x: Option[Int])
+ implicit val ofmt = jsonFormat[Opt]
+
+ "Optional fields with some value" should behave like checkRoundtrip(
+ Opt(Some(2)),
+ """{"x":2}"""
+ )
+
+ "Optional fields with no value (null)" should behave like checkRoundtrip(
+ Opt(None),
+ """{"x":null}"""
+ )
+
+ "Optional fields with no value (undefined)" should "deserialize" in {
+ assert("{}".parseJson.convertTo[Opt] == Opt(None))
+ }
+
}