|
1 |
| -import jsony, strutils, tables, times |
| 1 | +import jsony, strutils, tables, times, json |
2 | 2 |
|
3 | 3 | type Fraction = object
|
4 | 4 | numerator: int
|
@@ -46,3 +46,67 @@ proc parseHook(s: string, i: var int, v: var seq[Entry]) =
|
46 | 46 | let s = data.fromJson(seq[Entry])
|
47 | 47 | doAssert type(s) is seq[Entry]
|
48 | 48 | 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