From 9c2cdc94a2f7292a1872a8a24c0d9aed87e424c5 Mon Sep 17 00:00:00 2001 From: Dominik Picheta Date: Thu, 29 Mar 2018 11:57:53 +0100 Subject: [PATCH] Fixes #7433. --- lib/pure/json.nim | 10 ++++++++++ tests/stdlib/tjsonmacro.nim | 15 +++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/lib/pure/json.nim b/lib/pure/json.nim index 2b58d154e4..912cd68379 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 a69b034264..e8740c591e 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