diff options
| author | Jonathan Marler <johnnymarler@gmail.com> | 2021-01-28 19:15:38 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-02-01 12:40:49 -0800 |
| commit | 06b29c854656a1f9320ee16024b1c3a6b78180a5 (patch) | |
| tree | e26cc2f2abdc8215f5699ccfd030709f38da84fa /lib/std/json.zig | |
| parent | 1032a693211dd96abe349bfa76b43bb1f226cfda (diff) | |
| download | zig-06b29c854656a1f9320ee16024b1c3a6b78180a5.tar.gz zig-06b29c854656a1f9320ee16024b1c3a6b78180a5.zip | |
std.json large number support
Diffstat (limited to 'lib/std/json.zig')
| -rw-r--r-- | lib/std/json.zig | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/lib/std/json.zig b/lib/std/json.zig index 6a4fb827f9..ff258c7f3a 100644 --- a/lib/std/json.zig +++ b/lib/std/json.zig @@ -1255,6 +1255,7 @@ pub const Value = union(enum) { Bool: bool, Integer: i64, Float: f64, + NumberString: []const u8, String: []const u8, Array: Array, Object: ObjectMap, @@ -1269,6 +1270,7 @@ pub const Value = union(enum) { .Bool => |inner| try stringify(inner, options, out_stream), .Integer => |inner| try stringify(inner, options, out_stream), .Float => |inner| try stringify(inner, options, out_stream), + .NumberString => |inner| try out_stream.writeAll(inner), .String => |inner| try stringify(inner, options, out_stream), .Array => |inner| try stringify(inner.items, options, out_stream), .Object => |inner| { @@ -1341,6 +1343,12 @@ test "Value.jsonStringify" { { var buffer: [10]u8 = undefined; var fbs = std.io.fixedBufferStream(&buffer); + try (Value{ .NumberString = "43" }).jsonStringify(.{}, fbs.writer()); + testing.expectEqualSlices(u8, fbs.getWritten(), "43"); + } + { + var buffer: [10]u8 = undefined; + var fbs = std.io.fixedBufferStream(&buffer); try (Value{ .Float = 42 }).jsonStringify(.{}, fbs.writer()); testing.expectEqualSlices(u8, fbs.getWritten(), "4.2e+01"); } @@ -1356,7 +1364,7 @@ test "Value.jsonStringify" { var vals = [_]Value{ .{ .Integer = 1 }, .{ .Integer = 2 }, - .{ .Integer = 3 }, + .{ .NumberString = "3" }, }; try (Value{ .Array = Array.fromOwnedSlice(undefined, &vals), @@ -2205,7 +2213,12 @@ pub const Parser = struct { fn parseNumber(p: *Parser, n: std.meta.TagPayload(Token, Token.Number), input: []const u8, i: usize) !Value { return if (n.is_integer) - Value{ .Integer = try std.fmt.parseInt(i64, n.slice(input, i), 10) } + Value{ + .Integer = std.fmt.parseInt(i64, n.slice(input, i), 10) catch |e| switch (e) { + error.Overflow => return Value{ .NumberString = n.slice(input, i) }, + error.InvalidCharacter => |err| return err, + }, + } else Value{ .Float = try std.fmt.parseFloat(f64, n.slice(input, i)) }; } @@ -2293,7 +2306,8 @@ test "json.parser.dynamic" { \\ "Animated" : false, \\ "IDs": [116, 943, 234, 38793], \\ "ArrayOfObject": [{"n": "m"}], - \\ "double": 1.3412 + \\ "double": 1.3412, + \\ "LargeInt": 18446744073709551615 \\ } \\} ; @@ -2325,6 +2339,9 @@ test "json.parser.dynamic" { const double = image.Object.get("double").?; testing.expect(double.Float == 1.3412); + + const large_int = image.Object.get("LargeInt").?; + testing.expect(mem.eql(u8, large_int.NumberString, "18446744073709551615")); } test "import more json tests" { |
