+
+ /* Optional values */
+ j = json_object();
+ i1 = 0;
+ if(json_unpack(j, "{s?i}", "foo", &i1))
+ fail("json_unpack failed for optional key");
+ if(i1 != 0)
+ fail("json_unpack unpacked an optional key");
+ json_decref(j);
+
+ i1 = 0;
+ j = json_pack("{si}", "foo", 42);
+ if(json_unpack(j, "{s?i}", "foo", &i1))
+ fail("json_unpack failed for an optional value");
+ if(i1 != 42)
+ fail("json_unpack failed to unpack an optional value");
+ json_decref(j);
+
+ j = json_object();
+ i1 = i2 = i3 = 0;
+ if(json_unpack(j, "{s?[ii]s?{s{si}}}",
+ "foo", &i1, &i2,
+ "bar", "baz", "quux", &i3))
+ fail("json_unpack failed for complex optional values");
+ if(i1 != 0 || i2 != 0 || i3 != 0)
+ fail("json_unpack unexpectedly unpacked something");
+ json_decref(j);
+
+ j = json_pack("{s{si}}", "foo", "bar", 42);
+ if(json_unpack(j, "{s?{s?i}}", "foo", "bar", &i1))
+ fail("json_unpack failed for complex optional values");
+ if(i1 != 42)
+ fail("json_unpack failed to unpack");
+ json_decref(j);