Skip to content

Commit 25b6f8e

Browse files
committed
add skipHook to skip fields of object when serializing
1 parent d0e69bd commit 25b6f8e

File tree

4 files changed

+60
-5
lines changed

4 files changed

+60
-5
lines changed

README.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,33 @@ Gives us:
250250
"10/13"
251251
```
252252

253+
### `proc skipHook*()` Can be used to skip fields when serializing an object
254+
255+
If you want to skip some fields when serializing an object you can declare a `skipHook*()`
256+
257+
```nim
258+
type
259+
Conn = object
260+
id: int
261+
Foo = object
262+
a: int
263+
password: string
264+
b: float
265+
conn: Conn
266+
267+
proc skipHook*(T: typedesc[Foo], key: static string): bool =
268+
key in ["password", "conn"]
269+
270+
var v = Foo(a:1, password: "12345", b:0.5, conn: Conn(id: 1))
271+
let s = v.toJson()
272+
```
273+
274+
Gives us:
275+
276+
```
277+
"{"a":1,"b":0.5}"
278+
```
279+
253280
## Static writing with `toStaticJson`.
254281

255282
Sometimes you have some json, and you want to write it in a static way. There is a special function for that:

src/jsony.nim

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -769,11 +769,21 @@ proc dumpHook*(s: var string, v: object) =
769769
else:
770770
# Normal objects.
771771
for k, e in v.fieldPairs:
772-
if i > 0:
773-
s.add ','
774-
s.dumpKey(k)
775-
s.dumpHook(e)
776-
inc i
772+
when compiles(skipHook(type(v), k)):
773+
if skipHook(type(v), k):
774+
discard
775+
else:
776+
if i > 0:
777+
s.add ','
778+
s.dumpKey(k)
779+
s.dumpHook(e)
780+
inc i
781+
else:
782+
if i > 0:
783+
s.add ','
784+
s.dumpKey(k)
785+
s.dumpHook(e)
786+
inc i
777787
s.add '}'
778788

779789
proc dumpHook*[N, T](s: var string, v: array[N, t[T]]) =

tests/all.nim

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,6 @@ import test_tables
1818
import test_tojson
1919
import test_tuples
2020
import test_refs
21+
import test_skipHook
2122

2223
echo "all tests pass"

tests/test_skipHook.nim

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import jsony
2+
3+
type
4+
Conn = object
5+
id: int
6+
Foo = object
7+
a: int
8+
password: string
9+
b: float
10+
conn: Conn
11+
12+
proc skipHook(T: typedesc[Foo], key: static string): bool =
13+
key in ["password", "conn"]
14+
15+
let v = Foo(a:1, password: "12345", b:0.5, conn: Conn(id: 1))
16+
doAssert v.toJson() ==
17+
"""{"a":1,"b":0.5}"""

0 commit comments

Comments
 (0)