aboutsummaryrefslogtreecommitdiff
path: root/lib/std
diff options
context:
space:
mode:
authorMatthew Borkowski <matthew.h.borkowski@gmail.com>2021-05-13 09:43:55 -0400
committerMatthew Borkowski <matthew.h.borkowski@gmail.com>2021-05-13 09:43:55 -0400
commitcadb84b3ac891a99f7740be056d6bf6063b266f1 (patch)
tree31e2dc83113f82ae3e26cf0424e8a109e52f016a /lib/std
parente902c19c0e2bf7f0e9bc83b2c58d19ec024d56db (diff)
downloadzig-cadb84b3ac891a99f7740be056d6bf6063b266f1.tar.gz
zig-cadb84b3ac891a99f7740be056d6bf6063b266f1.zip
fix duplicate_field_behavior UseFirst in json.zig
Diffstat (limited to 'lib/std')
-rw-r--r--lib/std/json.zig11
1 files changed, 9 insertions, 2 deletions
diff --git a/lib/std/json.zig b/lib/std/json.zig
index 7515f8682d..8608990df6 100644
--- a/lib/std/json.zig
+++ b/lib/std/json.zig
@@ -1573,7 +1573,7 @@ fn parseInternal(comptime T: type, token: Token, tokens: *TokenStream, options:
// .UseLast => {},
// }
if (options.duplicate_field_behavior == .UseFirst) {
- break;
+ // do nothing, check of fields_seen[i] below will parse value without overwriting field
} else if (options.duplicate_field_behavior == .Error) {
return error.DuplicateJSONField;
} else if (options.duplicate_field_behavior == .UseLast) {
@@ -1586,7 +1586,11 @@ fn parseInternal(comptime T: type, token: Token, tokens: *TokenStream, options:
return error.UnexpectedValue;
}
} else {
- @field(r, field.name) = try parse(field.field_type, tokens, options);
+ if (fields_seen[i]) {
+ parseFree(field.field_type, try parse(field.field_type, tokens, options), options);
+ } else {
+ @field(r, field.name) = try parse(field.field_type, tokens, options);
+ }
}
fields_seen[i] = true;
found = true;
@@ -2013,6 +2017,9 @@ test "parse into struct with duplicate field" {
const T2 = struct { a: f64 };
try testing.expectEqual(T2{ .a = 0.25 }, try parse(T2, &TokenStream.init(str), options));
+ try testing.expectEqual(T2{ .a = 1.0 }, try parse(T2, &TokenStream.init(str),
+ .{ .duplicate_field_behavior = .UseFirst }
+ ));
}
/// A non-stream JSON parser which constructs a tree of Value's.