diff options
author | Dominik Picheta <dominikpicheta@gmail.com> | 2018-03-29 11:57:53 +0100 |
---|---|---|
committer | Dominik Picheta <dominikpicheta@gmail.com> | 2018-03-29 11:57:53 +0100 |
commit | 9c2cdc94a2f7292a1872a8a24c0d9aed87e424c5 (patch) | |
tree | 7d547f402edbc7413cd11a09b9896ba89fdbd143 | |
parent | 082b07168373d7132279c1d6873fc6e45fdac4fa (diff) | |
download | Nim-9c2cdc94a2f7292a1872a8a24c0d9aed87e424c5.tar.gz |
Fixes #7433.
-rw-r--r-- | lib/pure/json.nim | 10 | ||||
-rw-r--r-- | tests/stdlib/tjsonmacro.nim | 15 |
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 |