authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-11-27 00:53:09-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-11-27 00:53:09-05:00
log6bbe4cf9f7e0af4d3a15d42aece015792153c518
tree06ef9591d26a6eadaba334b889a57c4a28ebfa86
parent0860be03b154e648a963edf26867b23596ed98f0
parenta5b79017a32e8ee1c9486b3b3bf2c13fa7db899c
signature Commit is signed but in an unrecognized format.

Merge branch 'winksaville-Fix-pushToParent-to-work-for-arrays-of-Objects'


1 files changed, 14 insertions(+), 7 deletions(-)

std/json.zig+14-7
......@@ -1188,7 +1188,7 @@ pub const Parser = struct {
11881188 }
11891189
11901190 var value = p.stack.pop();
1191 try p.pushToParent(value);
1191 try p.pushToParent(&value);
11921192 },
11931193 Token.Id.String => {
11941194 try p.stack.append(try p.parseString(allocator, token, input, i));
......@@ -1251,7 +1251,7 @@ pub const Parser = struct {
12511251 }
12521252
12531253 var value = p.stack.pop();
1254 try p.pushToParent(value);
1254 try p.pushToParent(&value);
12551255 },
12561256 Token.Id.ObjectBegin => {
12571257 try p.stack.append(Value{ .Object = ObjectMap.init(allocator) });
......@@ -1312,19 +1312,19 @@ pub const Parser = struct {
13121312 }
13131313 }
13141314
1315 fn pushToParent(p: *Parser, value: Value) !void {
1316 switch (p.stack.at(p.stack.len - 1)) {
1315 fn pushToParent(p: *Parser, value: *const Value) !void {
1316 switch (p.stack.toSlice()[p.stack.len - 1]) {
13171317 // Object Parent -> [ ..., object, <key>, value ]
13181318 Value.String => |key| {
13191319 _ = p.stack.pop();
13201320
13211321 var object = &p.stack.items[p.stack.len - 1].Object;
1322 _ = try object.put(key, value);
1322 _ = try object.put(key, value.*);
13231323 p.state = State.ObjectKey;
13241324 },
13251325 // Array Parent -> [ ..., <array>, value ]
13261326 Value.Array => |*array| {
1327 try array.append(value);
1327 try array.append(value.*);
13281328 p.state = State.ArrayValue;
13291329 },
13301330 else => {
......@@ -1364,7 +1364,8 @@ test "json.parser.dynamic" {
13641364 \\ "Width": 100
13651365 \\ },
13661366 \\ "Animated" : false,
1367 \\ "IDs": [116, 943, 234, 38793]
1367 \\ "IDs": [116, 943, 234, 38793],
1368 \\ "ArrayOfObject": [{"n": "m"}]
13681369 \\ }
13691370 \\}
13701371 ;
......@@ -1387,4 +1388,10 @@ test "json.parser.dynamic" {
13871388
13881389 const animated = image.Object.get("Animated").?.value;
13891390 debug.assert(animated.Bool == false);
1391
1392 const array_of_object = image.Object.get("ArrayOfObject").?.value;
1393 debug.assert(array_of_object.Array.len == 1);
1394
1395 const obj0 = array_of_object.Array.at(0).Object.get("n").?.value;
1396 debug.assert(mem.eql(u8, obj0.String, "m"));
13901397}