Skip to content

Commit 9357676

Browse files
committed
Add dumpRenameHook
1 parent bb647e1 commit 9357676

3 files changed

Lines changed: 48 additions & 5 deletions

File tree

README.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,28 @@ Gives us:
277277
"{"a":1,"b":0.5}"
278278
```
279279

280+
### `proc dumpRenameHook*()` Can be used to rename fields when serializing.
281+
282+
If you want to rename some fields when serializing, declare `dumpRenameHook*()`
283+
284+
```nim
285+
type Node = ref object
286+
kind: string
287+
288+
proc dumpRenameHook*(v: typedesc[Node], fieldName: var string) =
289+
if fieldName == "kind":
290+
fieldName = "type"
291+
292+
var node = Node(kind: "root")
293+
let s = node.toJson()
294+
```
295+
296+
Gives us:
297+
298+
```
299+
{"type":"root"}
300+
```
301+
280302
## Static writing with `toStaticJson`.
281303

282304
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: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -758,9 +758,9 @@ proc dumpHook*(s: var string, v: string) =
758758

759759
s.add '"'
760760

761-
template dumpKey(s: var string, v: string) =
762-
const v2 = jsony.toJson(v) & ":"
763-
s.add v2
761+
template dumpKey(s: var string, v: var string) =
762+
s.add jsony.toJson(v)
763+
s.add ":"
764764

765765
proc dumpHook*(s: var string, v: char) =
766766
s.add '"'
@@ -819,19 +819,24 @@ proc dumpHook*(s: var string, v: object) =
819819
else:
820820
# Normal objects.
821821
for k, e in v.fieldPairs:
822+
var key = k
822823
when compiles(skipHook(type(v), k)):
823824
when skipHook(type(v), k):
824825
discard
825826
else:
827+
when compiles(dumpRenameHook(type(v), key)):
828+
dumpRenameHook(type(v), key)
826829
if i > 0:
827830
s.add ','
828-
s.dumpKey(k)
831+
s.dumpKey(key)
829832
s.dumpHook(e)
830833
inc i
831834
else:
835+
when compiles(dumpRenameHook(type(v), key)):
836+
dumpRenameHook(type(v), key)
832837
if i > 0:
833838
s.add ','
834-
s.dumpKey(k)
839+
s.dumpKey(key)
835840
s.dumpHook(e)
836841
inc i
837842
s.add '}'

tests/test_dumpRenameHook.nim

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import jsony
2+
3+
type
4+
Foo = object
5+
aVal: int
6+
bVal: bool
7+
8+
proc dumpRenameHook(v: typedesc[Foo], fieldName: var string) =
9+
if fieldName == "aVal":
10+
fieldName = "a_val"
11+
12+
let v = Foo(aVal:2, bVal: true)
13+
let ser = v.toJson()
14+
echo $ser
15+
doAssert ser ==
16+
"""{"a_val":2,"bVal":true}"""

0 commit comments

Comments
 (0)