authorgravatar for matthew.h.borkowski@gmail.comMatthew Borkowski <matthew.h.borkowski@gmail.com> 2021-05-13 09:43:55-04:00
committergravatar for matthew.h.borkowski@gmail.comMatthew Borkowski <matthew.h.borkowski@gmail.com> 2021-05-13 09:43:55-04:00
logcadb84b3ac891a99f7740be056d6bf6063b266f1
tree31e2dc83113f82ae3e26cf0424e8a109e52f016a
parente902c19c0e2bf7f0e9bc83b2c58d19ec024d56db

fix duplicate_field_behavior UseFirst in json.zig


1 files changed, 9 insertions(+), 2 deletions(-)

lib/std/json.zig+9-2
......@@ -1573,7 +1573,7 @@ fn parseInternal(comptime T: type, token: Token, tokens: *TokenStream, options:
15731573 // .UseLast => {},
15741574 // }
15751575 if (options.duplicate_field_behavior == .UseFirst) {
1576 break;
1576 // do nothing, check of fields_seen[i] below will parse value without overwriting field
15771577 } else if (options.duplicate_field_behavior == .Error) {
15781578 return error.DuplicateJSONField;
15791579 } else if (options.duplicate_field_behavior == .UseLast) {
......@@ -1586,7 +1586,11 @@ fn parseInternal(comptime T: type, token: Token, tokens: *TokenStream, options:
15861586 return error.UnexpectedValue;
15871587 }
15881588 } else {
1589 @field(r, field.name) = try parse(field.field_type, tokens, options);
1589 if (fields_seen[i]) {
1590 parseFree(field.field_type, try parse(field.field_type, tokens, options), options);
1591 } else {
1592 @field(r, field.name) = try parse(field.field_type, tokens, options);
1593 }
15901594 }
15911595 fields_seen[i] = true;
15921596 found = true;
......@@ -2013,6 +2017,9 @@ test "parse into struct with duplicate field" {
20132017
20142018 const T2 = struct { a: f64 };
20152019 try testing.expectEqual(T2{ .a = 0.25 }, try parse(T2, &TokenStream.init(str), options));
2020 try testing.expectEqual(T2{ .a = 1.0 }, try parse(T2, &TokenStream.init(str),
2021 .{ .duplicate_field_behavior = .UseFirst }
2022 ));
20162023}
20172024
20182025/// A non-stream JSON parser which constructs a tree of Value's.