fixes #21638; fromJson should support empty objects (#21641)

* fixes #21638; `fromJson` should supports empty objects

* complete the logic
This commit is contained in:
ringabout
2023-04-11 12:38:30 +08:00
committed by GitHub
parent 75205fee93
commit 5e016e4466
2 changed files with 21 additions and 11 deletions

View File

@@ -78,19 +78,24 @@ macro getDiscriminants(a: typedesc): seq[string] =
let sym = a[1]
let t = sym.getTypeImpl
let t2 = t[2]
doAssert t2.kind == nnkRecList
result = newTree(nnkBracket)
for ti in t2:
if ti.kind == nnkRecCase:
let key = ti[0][0]
let typ = ti[0][1]
result.add newLit key.strVal
if result.len > 0:
case t2.kind
of nnkEmpty: # allow empty objects
result = quote do:
@`result`
seq[string].default
of nnkRecList:
result = newTree(nnkBracket)
for ti in t2:
if ti.kind == nnkRecCase:
let key = ti[0][0]
result.add newLit key.strVal
if result.len > 0:
result = quote do:
@`result`
else:
result = quote do:
seq[string].default
else:
result = quote do:
seq[string].default
doAssert false, "unexpected kind: " & $t2.kind
macro initCaseObject(T: typedesc, fun: untyped): untyped =
## does the minimum to construct a valid case object, only initializing

View File

@@ -438,6 +438,11 @@ template fn() =
let json = inner.toJson(ToJsonOptions(enumMode: joptEnumSymbol))
doAssert $json == """{"x":"hello","y":"A"}"""
block: # bug #21638
type Something = object
doAssert "{}".parseJson.jsonTo(Something) == Something()
when false:
## TODO: Implement support for nested variant objects allowing the tests
## bellow to pass.