summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorDominik Picheta <dominikpicheta@gmail.com>2018-03-29 11:57:53 +0100
committerDominik Picheta <dominikpicheta@gmail.com>2018-03-29 11:57:53 +0100
commit9c2cdc94a2f7292a1872a8a24c0d9aed87e424c5 (patch)
tree7d547f402edbc7413cd11a09b9896ba89fdbd143
parent082b07168373d7132279c1d6873fc6e45fdac4fa (diff)
downloadNim-9c2cdc94a2f7292a1872a8a24c0d9aed87e424c5.tar.gz
Fixes #7433.
-rw-r--r--lib/pure/json.nim10
-rw-r--r--tests/stdlib/tjsonmacro.nim15
2 files changed, 25 insertions, 0 deletions
diff --git a/lib/pure/json.nim b/lib/pure/json.nim
index 2b58d154e..912cd6837 100644
--- a/lib/pure/json.nim
+++ b/lib/pure/json.nim
@@ -964,6 +964,16 @@ proc `{}`*(node: JsonNode, keys: varargs[string]): JsonNode =
       return nil
     result = result.fields.getOrDefault(key)
 
+proc `{}`*(node: JsonNode, index: varargs[int]): JsonNode =
+  ## Traverses the node and gets the given value. If any of the
+  ## indexes do not exist, returns ``nil``. Also returns ``nil`` if one of the
+  ## intermediate data structures is not an array.
+  result = node
+  for i in index:
+    if isNil(result) or result.kind != JArray or i >= node.len:
+      return nil
+    result = result.elems[i]
+
 proc getOrDefault*(node: JsonNode, key: string): JsonNode =
   ## Gets a field from a `node`. If `node` is nil or not an object or
   ## value at `key` does not exist, returns nil
diff --git a/tests/stdlib/tjsonmacro.nim b/tests/stdlib/tjsonmacro.nim
index a69b03426..e8740c591 100644
--- a/tests/stdlib/tjsonmacro.nim
+++ b/tests/stdlib/tjsonmacro.nim
@@ -315,6 +315,21 @@ when isMainModule:
     doAssert noYearDeser.year.isNone
     doAssert noYearDeser.engine.name == "V8"
 
+    # Issue #7433
+    type
+      Obj2 = object
+        n1: int
+        n2: Option[string]
+        n3: bool
+
+    var j = %*[ { "n1": 4, "n2": "ABC", "n3": true },
+                { "n1": 1, "n3": false },
+                { "n1": 1, "n2": "XYZ", "n3": false } ]
+
+    let jDeser = j.to(seq[Obj2])
+    doAssert jDeser[0].n2.get() == "ABC"
+    doAssert jDeser[1].n2.isNone()
+
   # Table[T, Y] support.
   block:
     type