aboutsummaryrefslogtreecommitdiff
path: root/lib/std/json.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2025-07-18 19:32:42 -0700
committerAndrew Kelley <andrew@ziglang.org>2025-07-19 16:05:01 -0700
commitc30df072bde3794ea5f3794d93f69e13640c6b7a (patch)
tree832ab5f7947e9dcc1d8d4fb792ce240c773b0cd0 /lib/std/json.zig
parenta288266f3310e9ba98456c5e968f8ce434be6cc7 (diff)
downloadzig-c30df072bde3794ea5f3794d93f69e13640c6b7a.tar.gz
zig-c30df072bde3794ea5f3794d93f69e13640c6b7a.zip
std.json: update to new I/O API
also do a little bit of namespace cleanup
Diffstat (limited to 'lib/std/json.zig')
-rw-r--r--lib/std/json.zig103
1 files changed, 59 insertions, 44 deletions
diff --git a/lib/std/json.zig b/lib/std/json.zig
index c0fb064c6a..f81ac1cd65 100644
--- a/lib/std/json.zig
+++ b/lib/std/json.zig
@@ -10,8 +10,8 @@
//! The high-level `stringify` serializes a Zig or `Value` type into JSON.
const builtin = @import("builtin");
-const testing = @import("std").testing;
-const ArrayList = @import("std").ArrayList;
+const std = @import("std");
+const testing = std.testing;
test Scanner {
var scanner = Scanner.initCompleteInput(testing.allocator, "{\"foo\": 123}\n");
@@ -41,11 +41,13 @@ test Value {
try testing.expectEqualSlices(u8, "goes", parsed.value.object.get("anything").?.string);
}
-test writeStream {
- var out = ArrayList(u8).init(testing.allocator);
+test Stringify {
+ var out: std.io.Writer.Allocating = .init(testing.allocator);
+ var write_stream: Stringify = .{
+ .writer = &out.writer,
+ .options = .{ .whitespace = .indent_2 },
+ };
defer out.deinit();
- var write_stream = writeStream(out.writer(), .{ .whitespace = .indent_2 });
- defer write_stream.deinit();
try write_stream.beginObject();
try write_stream.objectField("foo");
try write_stream.write(123);
@@ -55,16 +57,7 @@ test writeStream {
\\ "foo": 123
\\}
;
- try testing.expectEqualSlices(u8, expected, out.items);
-}
-
-test stringify {
- var out = ArrayList(u8).init(testing.allocator);
- defer out.deinit();
-
- const T = struct { a: i32, b: []const u8 };
- try stringify(T{ .a = 123, .b = "xy" }, .{}, out.writer());
- try testing.expectEqualSlices(u8, "{\"a\":123,\"b\":\"xy\"}", out.items);
+ try testing.expectEqualSlices(u8, expected, out.getWritten());
}
pub const ObjectMap = @import("json/dynamic.zig").ObjectMap;
@@ -73,18 +66,18 @@ pub const Value = @import("json/dynamic.zig").Value;
pub const ArrayHashMap = @import("json/hashmap.zig").ArrayHashMap;
-pub const validate = @import("json/scanner.zig").validate;
-pub const Error = @import("json/scanner.zig").Error;
-pub const reader = @import("json/scanner.zig").reader;
-pub const default_buffer_size = @import("json/scanner.zig").default_buffer_size;
-pub const Token = @import("json/scanner.zig").Token;
-pub const TokenType = @import("json/scanner.zig").TokenType;
-pub const Diagnostics = @import("json/scanner.zig").Diagnostics;
-pub const AllocWhen = @import("json/scanner.zig").AllocWhen;
-pub const default_max_value_len = @import("json/scanner.zig").default_max_value_len;
-pub const Reader = @import("json/scanner.zig").Reader;
-pub const Scanner = @import("json/scanner.zig").Scanner;
-pub const isNumberFormattedLikeAnInteger = @import("json/scanner.zig").isNumberFormattedLikeAnInteger;
+pub const Scanner = @import("json/Scanner.zig");
+pub const validate = Scanner.validate;
+pub const Error = Scanner.Error;
+pub const reader = Scanner.reader;
+pub const default_buffer_size = Scanner.default_buffer_size;
+pub const Token = Scanner.Token;
+pub const TokenType = Scanner.TokenType;
+pub const Diagnostics = Scanner.Diagnostics;
+pub const AllocWhen = Scanner.AllocWhen;
+pub const default_max_value_len = Scanner.default_max_value_len;
+pub const Reader = Scanner.Reader;
+pub const isNumberFormattedLikeAnInteger = Scanner.isNumberFormattedLikeAnInteger;
pub const ParseOptions = @import("json/static.zig").ParseOptions;
pub const Parsed = @import("json/static.zig").Parsed;
@@ -99,27 +92,49 @@ pub const innerParseFromValue = @import("json/static.zig").innerParseFromValue;
pub const ParseError = @import("json/static.zig").ParseError;
pub const ParseFromValueError = @import("json/static.zig").ParseFromValueError;
-pub const StringifyOptions = @import("json/stringify.zig").StringifyOptions;
-pub const stringify = @import("json/stringify.zig").stringify;
-pub const stringifyMaxDepth = @import("json/stringify.zig").stringifyMaxDepth;
-pub const stringifyArbitraryDepth = @import("json/stringify.zig").stringifyArbitraryDepth;
-pub const stringifyAlloc = @import("json/stringify.zig").stringifyAlloc;
-pub const writeStream = @import("json/stringify.zig").writeStream;
-pub const writeStreamMaxDepth = @import("json/stringify.zig").writeStreamMaxDepth;
-pub const writeStreamArbitraryDepth = @import("json/stringify.zig").writeStreamArbitraryDepth;
-pub const WriteStream = @import("json/stringify.zig").WriteStream;
-pub const encodeJsonString = @import("json/stringify.zig").encodeJsonString;
-pub const encodeJsonStringChars = @import("json/stringify.zig").encodeJsonStringChars;
-
-pub const Formatter = @import("json/fmt.zig").Formatter;
-pub const fmt = @import("json/fmt.zig").fmt;
+pub const Stringify = @import("json/Stringify.zig");
+
+/// Returns a formatter that formats the given value using stringify.
+pub fn fmt(value: anytype, options: Stringify.Options) Formatter(@TypeOf(value)) {
+ return Formatter(@TypeOf(value)){ .value = value, .options = options };
+}
+
+test fmt {
+ const expectFmt = std.testing.expectFmt;
+ try expectFmt("123", "{f}", .{fmt(@as(u32, 123), .{})});
+ try expectFmt(
+ \\{"num":927,"msg":"hello","sub":{"mybool":true}}
+ , "{f}", .{fmt(struct {
+ num: u32,
+ msg: []const u8,
+ sub: struct {
+ mybool: bool,
+ },
+ }{
+ .num = 927,
+ .msg = "hello",
+ .sub = .{ .mybool = true },
+ }, .{})});
+}
+
+/// Formats the given value using stringify.
+pub fn Formatter(comptime T: type) type {
+ return struct {
+ value: T,
+ options: Stringify.Options,
+
+ pub fn format(self: @This(), writer: *std.Io.Writer) std.Io.Writer.Error!void {
+ try Stringify.value(self.value, self.options, writer);
+ }
+ };
+}
test {
_ = @import("json/test.zig");
- _ = @import("json/scanner.zig");
+ _ = Scanner;
_ = @import("json/dynamic.zig");
_ = @import("json/hashmap.zig");
_ = @import("json/static.zig");
- _ = @import("json/stringify.zig");
+ _ = Stringify;
_ = @import("json/JSONTestSuite_test.zig");
}