diff options
-rw-r--r-- | lib/pure/json.nim | 2 | ||||
-rw-r--r-- | tests/stdlib/tjsonmacro.nim | 15 |
2 files changed, 16 insertions, 1 deletions
diff --git a/lib/pure/json.nim b/lib/pure/json.nim index 912cd6837..da1b66188 100644 --- a/lib/pure/json.nim +++ b/lib/pure/json.nim @@ -1697,7 +1697,7 @@ proc createConstructor(typeSym, jsonNode: NimNode): NimNode = result = quote do: ( - if `lenientJsonNode`.isNil: `workaround`[`optionGeneric`]() else: some[`optionGeneric`](`value`) + if `lenientJsonNode`.isNil or `jsonNode`.kind == JNull: `workaround`[`optionGeneric`]() else: some[`optionGeneric`](`value`) ) of "table", "orderedtable": let tableKeyType = typeSym[1] diff --git a/tests/stdlib/tjsonmacro.nim b/tests/stdlib/tjsonmacro.nim index e8740c591..f13d2e5cb 100644 --- a/tests/stdlib/tjsonmacro.nim +++ b/tests/stdlib/tjsonmacro.nim @@ -330,6 +330,21 @@ when isMainModule: doAssert jDeser[0].n2.get() == "ABC" doAssert jDeser[1].n2.isNone() + # Issue #6902 + type + Obj = object + n1: int + n2: Option[int] + n3: Option[string] + n4: Option[bool] + + var j0 = parseJson("""{"n1": 1, "n2": null, "n3": null, "n4": null}""") + let j0Deser = j0.to(Obj) + doAssert j0Deser.n1 == 1 + doAssert j0Deser.n2.isNone() + doAssert j0Deser.n3.isNone() + doAssert j0Deser.n4.isNone() + # Table[T, Y] support. block: type |