Skip to content

Commit 423f718

Browse files
committed
dump json nodes
Signed-off-by: George Lemon <georgelemon@protonmail.com>
1 parent cbc3999 commit 423f718

1 file changed

Lines changed: 30 additions & 3 deletions

File tree

src/openparser/json.nim

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,12 +177,11 @@ proc dumpHook*(s: var string, v: enum)
177177
proc dumpHook*[K: string, V](s: var string, val: AnyTable[K, V])
178178
proc dumpHook*[T](s: var string, val: set[T])
179179
proc dumpHook*[T: distinct](s: var string, v: T)
180+
proc dumpHook*(s: var string, v: JsonNode)
180181

181182
proc toJson*[T](v: T, opts: JsonOptions = nil): string =
182183
## Convert a Nim object to its JSON string representation using dump hooks.
183-
var s = ""
184-
dumpHook(s, v)
185-
result = s
184+
result.dumpHook(v)
186185

187186
macro toStaticJson*(v: typed, opts: static JsonOptions = nil): untyped =
188187
## Converts a Nim object to its JSON representation.
@@ -325,6 +324,34 @@ proc dumpHook*(s: var string, val: tuple) =
325324
inc i
326325
s.add("}")
327326

327+
proc dumpHook*(s: var string, v: JsonNode) =
328+
## Converts a JsonNode to its JSON string representation.
329+
if v == nil:
330+
s.add("null")
331+
return
332+
case v.kind
333+
of JObject:
334+
s.add("{")
335+
var i = 0
336+
for k, item in v.fields:
337+
if i > 0: s.add(",")
338+
s.add("\"" & k & "\"") # JSON object key (string)
339+
s.add(":")
340+
dumpHook(s, item) # JSON object value
341+
inc i
342+
s.add("}")
343+
of JArray:
344+
s.add("[")
345+
for i, item in v.elems:
346+
if i > 0: s.add(",") # add comma between items
347+
dumpHook(s, item)
348+
s.add("]")
349+
of JString: dumpHook(s, v.str)
350+
of JInt: dumpHook(s, v.num)
351+
of JFloat: dumpHook(s, v.fnum)
352+
of JBool: dumpHook(s, v.bval)
353+
of JNull: s.add("null")
354+
328355
proc objectToJson*(v, valImpl: NimNode, opts: JsonOptions = nil): NimNode =
329356
var hasRecCase = false
330357
for field in valImpl[2]:

0 commit comments

Comments
 (0)