Skip to content

Commit 41a9fe0

Browse files
committed
Add a parse hook example for Non unique / double keys in json.
1 parent efa5977 commit 41a9fe0

File tree

1 file changed

+65
-1
lines changed

1 file changed

+65
-1
lines changed

tests/test_parseHook.nim

+65-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import jsony, strutils, tables, times
1+
import jsony, strutils, tables, times, json
22

33
type Fraction = object
44
numerator: int
@@ -46,3 +46,67 @@ proc parseHook(s: string, i: var int, v: var seq[Entry]) =
4646
let s = data.fromJson(seq[Entry])
4747
doAssert type(s) is seq[Entry]
4848
doAssert $s == """@[(id: "1", count: 12, filled: 11), (id: "2", count: 66, filled: 0), (id: "3", count: 99, filled: 99)]"""
49+
50+
type Entry2 = object
51+
id: int
52+
pre: int
53+
post: int
54+
kind: string
55+
56+
let data2 = """{
57+
"id": 3444,
58+
"changes": [1, 2, "hi"]
59+
}"""
60+
61+
proc parseHook(s: string, i: var int, v: var Entry2) =
62+
var entry: JsonNode
63+
parseHook(s, i, entry)
64+
v = Entry2()
65+
v.id = entry["id"].getInt()
66+
v.pre = entry["changes"][0].getInt()
67+
v.post = entry["changes"][1].getInt()
68+
v.kind = entry["changes"][2].getStr()
69+
70+
let s2 = data2.fromJson(Entry2)
71+
doAssert type(s2) is Entry2
72+
doAssert $s2 == """(id: 3444, pre: 1, post: 2, kind: "hi")"""
73+
74+
# Non unique / double keys in json
75+
# https://forum.nim-lang.org/t/8787
76+
type Header = object
77+
key: string
78+
value: string
79+
proc parseHook(s: string, i: var int, v: var seq[Header]) =
80+
eatChar(s, i, '{')
81+
while i < s.len:
82+
eatSpace(s, i)
83+
if i < s.len and s[i] == '}':
84+
break
85+
var key, value: string
86+
parseHook(s, i, key)
87+
eatChar(s, i, ':')
88+
parseHook(s, i, value)
89+
v.add(Header(key: key, value: value))
90+
eatSpace(s, i)
91+
if i < s.len and s[i] == ',':
92+
inc i
93+
else:
94+
break
95+
eatChar(s, i, '}')
96+
97+
let data3 = """{
98+
"Cache-Control": "private, max-age=0d",
99+
"Content-Encoding": "brd",
100+
"Set-Cookie": "name=valued",
101+
"Set-Cookie": "name=value; name2=value2; name3=value3d"
102+
}"""
103+
104+
let headers = data3.fromJson(seq[Header])
105+
doAssert headers[0].key == "Cache-Control"
106+
doAssert headers[0].value == "private, max-age=0d"
107+
doAssert headers[1].key == "Content-Encoding"
108+
doAssert headers[1].value == "brd"
109+
doAssert headers[2].key == "Set-Cookie"
110+
doAssert headers[2].value == "name=valued"
111+
doAssert headers[3].key == "Set-Cookie"
112+
doAssert headers[3].value == "name=value; name2=value2; name3=value3d"

0 commit comments

Comments
 (0)