diff --git a/json_serialization/writer.nim b/json_serialization/writer.nim index 78125aa..c972ad6 100644 --- a/json_serialization/writer.nim +++ b/json_serialization/writer.nim @@ -124,9 +124,16 @@ proc writeIterable*(w: var JsonWriter, collection: auto) = append ']' -proc writeArray[T](w: var JsonWriter, elements: openarray[T]) = +proc writeArray*[T](w: var JsonWriter, elements: openarray[T]) = writeIterable(w, elements) +# this construct catches `array[N, char]` which otherwise won't decompose into +# openArray[char] - we treat any array-like thing-of-characters as a string in +# the output +template isStringLike(v: string|cstring|openArray[char]|seq[char]): bool = true +template isStringLike[N](v: array[N, char]): bool = true +template isStringLike(v: auto): bool = false + proc writeValue*(w: var JsonWriter, value: auto) = mixin enumInstanceSerializedFields, writeValue, writeFieldIMPL @@ -140,7 +147,7 @@ proc writeValue*(w: var JsonWriter, value: auto) = append "null" else: writeValue(w, value[]) - elif value is string|cstring: + elif isStringLike(value): append '"' template addPrefixSlash(c) = diff --git a/tests/test_serialization.nim b/tests/test_serialization.nim index 83d51f4..9d8ec89 100644 --- a/tests/test_serialization.nim +++ b/tests/test_serialization.nim @@ -149,3 +149,8 @@ suite "toJson tests": check: $original == $decoded + test "openArray[char]": + check: + "abc" == Json.decode(Json.encode(['a', 'b', 'c']), string) + "abc" == Json.decode(Json.encode(@['a', 'b', 'c']), string) +