diff --git a/json.zig b/json.zig index 18f9648d4beef97d7faff52360c63a5fc103105d..e917dcfaa50565c302644462a7b9f57db1484c98 100644 --- a/json.zig +++ b/json.zig @@ -743,35 +743,35 @@ pub fn stringify(writer: anytype, value: anytype, options: std.json.Stringify.Op try writer.writeAll("\""); } } else { - return error.Unexpected; + var view = std.unicode.Utf8View.init(value) catch return error.Unexpected; + var iter = view.iterator(); + try writer.writeAll("\""); + while (iter.nextCodepointSlice()) |sl| { + const cp = std.unicode.utf8Decode(sl) catch unreachable; + if (cp < 128) { + const c: u8 = @intCast(cp); + try writer.writeAll(switch (c) { + 0x08 => "\\b", + 0x09 => "\\t", + 0x0a => "\\n", + 0x0c => "\\f", + 0x0d => "\\r", + 0x20...0x21 => &.{c}, + 0x22 => "\\\"", + 0x23...0x7e => &.{c}, + else => "\\u00" ++ extras.to_hex([_]u8{c}), + }); + continue; + } + try writer.writeAll(sl); + } + try writer.writeAll("\""); + return; } return; } if (comptime extras.isArrayOf(u8)(T)) { - if (extras.matchesAll(u8, &value, std.ascii.isAscii)) { - if (extras.matchesAll(u8, &value, std.ascii.isPrint)) { - try writer.writevAll(&.{ &.{'"'}, &value, &.{'"'} }); - } else { - try writer.writeAll("\""); - for (&value) |c| { - try writer.writeAll(switch (c) { - 0x08 => "\\b", - 0x09 => "\\t", - 0x0a => "\\n", - 0x0c => "\\f", - 0x0d => "\\r", - 0x20...0x21 => &.{c}, - 0x22 => "\\\"", - 0x23...0x7e => &.{c}, - else => "\\u00" ++ extras.to_hex([_]u8{c}), - }); - } - try writer.writeAll("\""); - } - } else { - return error.Unexpected; - } - return; + return stringify(writer, &value, options); } if (comptime extras.isSlice(T)) { try writer.writeAll("[");