@@ -177,12 +177,11 @@ proc dumpHook*(s: var string, v: enum)
177177proc dumpHook * [K: string , V](s: var string , val: AnyTable [K, V])
178178proc dumpHook * [T](s: var string , val: set [T])
179179proc dumpHook * [T: distinct ](s: var string , v: T)
180+ proc dumpHook * (s: var string , v: JsonNode )
180181
181182proc 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
187186macro 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+
328355proc objectToJson * (v, valImpl: NimNode , opts: JsonOptions = nil ): NimNode =
329356 var hasRecCase = false
330357 for field in valImpl[2 ]:
0 commit comments