diff options
author | Dominik Picheta <dominikpicheta@googlemail.com> | 2016-05-15 12:39:26 +0100 |
---|---|---|
committer | Dominik Picheta <dominikpicheta@googlemail.com> | 2016-05-15 12:39:26 +0100 |
commit | f4f7edf00f19e5abcd4f3a4631261e109d6b8c4d (patch) | |
tree | e15fcb1683a5f9fcddfc379cc2de0088d2d4f4ca | |
parent | c770715b167c2bd1d57b3e2e28407c5a526bc4c0 (diff) | |
parent | 6e135468f852e2aba7b1ce731ec91b67041587bf (diff) | |
download | Nim-f4f7edf00f19e5abcd4f3a4631261e109d6b8c4d.tar.gz |
Merge pull request #4075 from yglukhov/json
Json serialization for openarrays and objects
-rw-r--r-- | lib/pure/json.nim | 47 | ||||
-rw-r--r-- | web/news.txt | 2 |
2 files changed, 40 insertions, 9 deletions
diff --git a/lib/pure/json.nim b/lib/pure/json.nim index b9da8a0dd..483804ed8 100644 --- a/lib/pure/json.nim +++ b/lib/pure/json.nim @@ -707,17 +707,27 @@ proc `%`*(b: bool): JsonNode = proc `%`*(keyVals: openArray[tuple[key: string, val: JsonNode]]): JsonNode = ## Generic constructor for JSON data. Creates a new `JObject JsonNode` - new(result) - result.kind = JObject - result.fields = initTable[string, JsonNode](4) + result = newJObject() for key, val in items(keyVals): result.fields[key] = val -proc `%`*(elements: openArray[JsonNode]): JsonNode = +template `%`*(j: JsonNode): JsonNode = j + +proc `%`*[T](elements: openArray[T]): JsonNode = ## Generic constructor for JSON data. Creates a new `JArray JsonNode` - new(result) - result.kind = JArray - newSeq(result.elems, elements.len) - for i, p in pairs(elements): result.elems[i] = p + result = newJArray() + for elem in elements: result.add(%elem) + +proc `%`*(o: object): JsonNode = + ## Generic constructor for JSON data. Creates a new `JObject JsonNode` + result = newJObject() + for k, v in o.fieldPairs: result[k] = %v + +proc `%`*(o: ref object): JsonNode = + ## Generic constructor for JSON data. Creates a new `JObject JsonNode` + if o.isNil: + result = newJNull() + else: + result = %(o[]) proc toJson(x: NimNode): NimNode {.compiletime.} = case x.kind @@ -736,6 +746,9 @@ proc toJson(x: NimNode): NimNode {.compiletime.} = result = newNimNode(nnkTableConstr) x.expectLen(0) + of nnkNilLit: + result = newCall("newJNull") + else: result = x @@ -1325,10 +1338,26 @@ when isMainModule: var j4 = %*{"test": nil} doAssert j4 == %{"test": newJNull()} - echo("99% of tests finished. Going to try loading file.") + let seqOfNodes = @[%1, %2] + let jSeqOfNodes = %seqOfNodes + doAssert(jSeqOfNodes[1].num == 2) + + type MyObj = object + a, b: int + s: string + f32: float32 + f64: float64 + next: ref MyObj + var m: MyObj + m.s = "hi" + m.a = 5 + let jMyObj = %m + doAssert(jMyObj["a"].num == 5) + doAssert(jMyObj["s"].str == "hi") # Test loading of file. when not defined(js): + echo("99% of tests finished. Going to try loading file.") var parsed = parseFile("tests/testdata/jsontest.json") try: diff --git a/web/news.txt b/web/news.txt index b6ce533c8..87896df3f 100644 --- a/web/news.txt +++ b/web/news.txt @@ -37,6 +37,8 @@ Changes affecting backwards compatibility by the language. With this change, ``alloc`` and ``dealloc`` are no longer aliases for ``malloc`` and ``free`` - use ``c_malloc`` and ``c_free`` if you need that. +- The ``json.%`` operator is now overloaded for ``object``, ``ref object`` and + ``openarray[T]``. Library Additions |