summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--lib/pure/json.nim5
-rw-r--r--tests/stdlib/tjsonmacro.nim19
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
id='n152' href='#n152'>152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172