@@ -182,6 +182,7 @@ proc dumpHook*(s: var string, v: JsonNode)
182182type t[T] = tuple [a: string , b: T]
183183proc dumpHook * [N, T](s: var string , v: array [N, t[T]])
184184proc dumpHook * [N, T](s: var string , v: array [N, T])
185+ proc dumpHook * [T](s: var string , v: Option [T])
185186
186187proc toJson * [T](v: T, opts: JsonOptions = nil ): string =
187188 # # Convert a Nim object to its JSON string representation using dump hooks.
@@ -377,6 +378,13 @@ proc dumpHook*[N, T](s: var string, v: array[N, T]) =
377378 dumpHook (s, item) # convert each item to JSON
378379 s.add (" ]" )
379380
381+ proc dumpHook * [T](s: var string , v: Option [T]) =
382+ # # Converts an Option[T] to JSON, where None is represented as null
383+ if v.isSome:
384+ dumpHook (s, v.get ())
385+ else :
386+ s.add (" null" )
387+
380388proc objectToJson * (v, valImpl: NimNode , opts: JsonOptions = nil ): NimNode =
381389 var hasRecCase = false
382390 for field in valImpl[2 ]:
@@ -911,6 +919,19 @@ proc parseHook*[T](parser: var JsonParser, field: string, v: var seq[T]) =
911919 parser.walk ()
912920 parser.expectSkip (tkRBracket) # end of array
913921
922+
923+ proc parseHook * [T](parser: var JsonParser , field: string , v: var Option [T]) =
924+ # # A hook to parse a value wrapped in an Option type, treating null as
925+ # # None and any other value as Some(value).
926+ if parser.curr.kind == tkNull:
927+ v = none (T)
928+ parser.walk ()
929+ else :
930+ var tmp: T
931+ parser.parseHook (" " , tmp)
932+ v = some (tmp)
933+
934+
914935#
915936# JsonNode Objects
916937#
0 commit comments