diff options
-rw-r--r-- | lib/pure/json.nim | 5 | ||||
-rw-r--r-- | tests/stdlib/tjsonmacro.nim | 19 |
2 files changed, 23 insertions, 1 deletions
diff --git a/lib/pure/json.nim b/lib/pure/json.nim index 6153e2f03..1d2f480c4 100644 --- a/lib/pure/json.nim +++ b/lib/pure/json.nim @@ -1744,6 +1744,11 @@ proc createConstructor(typeSym, jsonNode: NimNode): NimNode = let obj = getType(typeSym) result = processType(typeSym, obj, jsonNode, false) of nnkSym: + # Handle JsonNode. + if ($typeSym).cmpIgnoreStyle("jsonnode") == 0: + return jsonNode + + # Handle all other types. let obj = getType(typeSym) if obj.kind == nnkBracketExpr: # When `Sym "Foo"` turns out to be a `ref object`. diff --git a/tests/stdlib/tjsonmacro.nim b/tests/stdlib/tjsonmacro.nim index 01fa43aa7..2baa7bed1 100644 --- a/tests/stdlib/tjsonmacro.nim +++ b/tests/stdlib/tjsonmacro.nim @@ -339,4 +339,21 @@ when isMainModule: doAssert dataDeser.friends["John"].age == 35 doAssert dataDeser.friends["Elizabeth"].age == 23 - # TODO: JsonNode support \ No newline at end of file + # JsonNode support + block: + type + Test = object + name: string + fallback: JsonNode + + let data = """ + {"name": "FooBar", "fallback": 56.42} + """ + + let dataParsed = parseJson(data) + let dataDeser = to(dataParsed, Test) + doAssert dataDeser.name == "FooBar" + doAssert dataDeser.fallback.kind == JFloat + doAssert dataDeser.fallback.getFloat() == 56.42 + + # TODO: Cycles lead to infinite loops. \ No newline at end of file |