diff --git a/base/schema-pike/test/inputs/schema/integer-type.schema/default/TopLevel.pmod b/head/schema-pike/test/inputs/schema/integer-type.schema/default/TopLevel.pmod
index 4d75fc7..ba7efc7 100644
--- a/base/schema-pike/test/inputs/schema/integer-type.schema/default/TopLevel.pmod
+++ b/head/schema-pike/test/inputs/schema/integer-type.schema/default/TopLevel.pmod
@@ -43,13 +43,27 @@ class TopLevel {
 TopLevel TopLevel_from_JSON(mixed json) {
     TopLevel retval = TopLevel();
 
+    if (json["above_i32_max"] < 0) error("Value below minimum");
+    if (json["above_i32_max"] > 2147483648) error("Value above maximum");
     retval.above_i32_max = json["above_i32_max"];
+    if (json["below_i32_min"] < -2147483649) error("Value below minimum");
+    if (json["below_i32_min"] > 0) error("Value above maximum");
     retval.below_i32_min = json["below_i32_min"];
+    if (json["i32_range"] < -2147483648) error("Value below minimum");
+    if (json["i32_range"] > 2147483647) error("Value above maximum");
     retval.i32_range = json["i32_range"];
+    if (json["large_bounds"] < -9007199254740991) error("Value below minimum");
+    if (json["large_bounds"] > 9007199254740991) error("Value above maximum");
     retval.large_bounds = json["large_bounds"];
+    if (json["only_maximum"] > 0) error("Value above maximum");
     retval.only_maximum = json["only_maximum"];
+    if (json["only_minimum"] < 0) error("Value below minimum");
     retval.only_minimum = json["only_minimum"];
+    if (json["small_negative"] < -100) error("Value below minimum");
+    if (json["small_negative"] > 0) error("Value above maximum");
     retval.small_negative = json["small_negative"];
+    if (json["small_positive"] < 0) error("Value below minimum");
+    if (json["small_positive"] > 100) error("Value above maximum");
     retval.small_positive = json["small_positive"];
     retval.unbounded = json["unbounded"];
 
diff --git a/base/schema-pike/test/inputs/schema/minmax-integer.schema/default/TopLevel.pmod b/head/schema-pike/test/inputs/schema/minmax-integer.schema/default/TopLevel.pmod
index bcb4d4b..7eca078 100644
--- a/base/schema-pike/test/inputs/schema/minmax-integer.schema/default/TopLevel.pmod
+++ b/head/schema-pike/test/inputs/schema/minmax-integer.schema/default/TopLevel.pmod
@@ -42,12 +42,22 @@ TopLevel TopLevel_from_JSON(mixed json) {
     TopLevel retval = TopLevel();
 
     retval.free = json["free"];
+    if (json["intersection"] < 4) error("Value below minimum");
+    if (json["intersection"] > 5) error("Value above maximum");
     retval.intersection = json["intersection"];
+    if (json["max"] > 5) error("Value above maximum");
     retval.max = json["max"];
+    if (json["min"] < 3) error("Value below minimum");
     retval.min = json["min"];
+    if (json["minmax"] < 3) error("Value below minimum");
+    if (json["minmax"] > 5) error("Value above maximum");
     retval.minmax = json["minmax"];
+    if (json["minMaxIntersection"] < 3) error("Value below minimum");
+    if (json["minMaxIntersection"] > 5) error("Value above maximum");
     retval.min_max_intersection = json["minMaxIntersection"];
     retval.min_max_union = json["minMaxUnion"];
+    if (json["union"] < 3) error("Value below minimum");
+    if (json["union"] > 6) error("Value above maximum");
     retval.union = json["union"];
 
     return retval;
diff --git a/head/schema-pike/test/inputs/schema/minmax.schema/default/TopLevel.pmod b/head/schema-pike/test/inputs/schema/minmax.schema/default/TopLevel.pmod
new file mode 100644
index 0000000..e8cce03
--- /dev/null
+++ b/head/schema-pike/test/inputs/schema/minmax.schema/default/TopLevel.pmod
@@ -0,0 +1,64 @@
+// This source has been automatically generated by quicktype.
+// ( https://github.com/quicktype/quicktype )
+//
+// To use this code, simply import it into your project as a Pike module.
+// To JSON-encode your object, you can pass it to `Standards.JSON.encode`
+// or call `encode_json` on it.
+//
+// To decode a JSON string, first pass it to `Standards.JSON.decode`,
+// and then pass the result to `<YourClass>_from_JSON`.
+// It will return an instance of <YourClass>.
+// Bear in mind that these functions have unexpected behavior,
+// and will likely throw an error, if the JSON string does not
+// match the expected interface, even if the JSON itself is valid.
+
+class TopLevel {
+    float free;                 // json: "free"
+    float intersection;         // json: "intersection"
+    float max;                  // json: "max"
+    float min;                  // json: "min"
+    float minmax;               // json: "minmax"
+    float min_max_intersection; // json: "minMaxIntersection"
+    float min_max_union;        // json: "minMaxUnion"
+    float union;                // json: "union"
+
+    string encode_json() {
+        mapping(string:mixed) json = ([
+            "free" : free,
+            "intersection" : intersection,
+            "max" : max,
+            "min" : min,
+            "minmax" : minmax,
+            "minMaxIntersection" : min_max_intersection,
+            "minMaxUnion" : min_max_union,
+            "union" : union,
+        ]);
+
+        return Standards.JSON.encode(json);
+    }
+}
+
+TopLevel TopLevel_from_JSON(mixed json) {
+    TopLevel retval = TopLevel();
+
+    retval.free = (float)json["free"];
+    if (json["intersection"] < 4) error("Value below minimum");
+    if (json["intersection"] > 5) error("Value above maximum");
+    retval.intersection = (float)json["intersection"];
+    if (json["max"] > 5) error("Value above maximum");
+    retval.max = (float)json["max"];
+    if (json["min"] < 3) error("Value below minimum");
+    retval.min = (float)json["min"];
+    if (json["minmax"] < 3) error("Value below minimum");
+    if (json["minmax"] > 5) error("Value above maximum");
+    retval.minmax = (float)json["minmax"];
+    if (json["minMaxIntersection"] < 3) error("Value below minimum");
+    if (json["minMaxIntersection"] > 5) error("Value above maximum");
+    retval.min_max_intersection = (float)json["minMaxIntersection"];
+    retval.min_max_union = (float)json["minMaxUnion"];
+    if (json["union"] < 3) error("Value below minimum");
+    if (json["union"] > 6) error("Value above maximum");
+    retval.union = (float)json["union"];
+
+    return retval;
+}
diff --git a/base/schema-pike/test/inputs/schema/minmaxlength.schema/default/TopLevel.pmod b/head/schema-pike/test/inputs/schema/minmaxlength.schema/default/TopLevel.pmod
index 1e60d18..3a16aeb 100644
--- a/base/schema-pike/test/inputs/schema/minmaxlength.schema/default/TopLevel.pmod
+++ b/head/schema-pike/test/inputs/schema/minmaxlength.schema/default/TopLevel.pmod
@@ -41,14 +41,24 @@ class TopLevel {
 TopLevel TopLevel_from_JSON(mixed json) {
     TopLevel retval = TopLevel();
 
+    if (sizeof(json["intersection"]) < 4) error("String too short");
+    if (sizeof(json["intersection"]) > 5) error("String too long");
     retval.intersection = json["intersection"];
     if (arrayp(json["inUnion"])) error("Unexpected array");
     retval.in_union = json["inUnion"];
+    if (sizeof(json["maxlength"]) > 5) error("String too long");
     retval.maxlength = json["maxlength"];
+    if (sizeof(json["minlength"]) < 3) error("String too short");
     retval.minlength = json["minlength"];
+    if (sizeof(json["minMaxIntersection"]) < 3) error("String too short");
+    if (sizeof(json["minMaxIntersection"]) > 5) error("String too long");
     retval.min_max_intersection = json["minMaxIntersection"];
+    if (sizeof(json["minmaxlength"]) < 3) error("String too short");
+    if (sizeof(json["minmaxlength"]) > 5) error("String too long");
     retval.minmaxlength = json["minmaxlength"];
     retval.min_max_union = json["minMaxUnion"];
+    if (sizeof(json["union"]) < 3) error("String too short");
+    if (sizeof(json["union"]) > 6) error("String too long");
     retval.union = json["union"];
 
     return retval;
diff --git a/base/schema-pike/test/inputs/schema/optional-const-ref.schema/default/TopLevel.pmod b/head/schema-pike/test/inputs/schema/optional-const-ref.schema/default/TopLevel.pmod
index 1f5a1d4..3102527 100644
--- a/base/schema-pike/test/inputs/schema/optional-const-ref.schema/default/TopLevel.pmod
+++ b/head/schema-pike/test/inputs/schema/optional-const-ref.schema/default/TopLevel.pmod
@@ -40,11 +40,21 @@ TopLevel TopLevel_from_JSON(mixed json) {
     TopLevel retval = TopLevel();
 
     retval.coordinates = json["coordinates"];
+    if (has_index(json, "count") && json["count"] < 1) error("Value below minimum");
+    if (has_index(json, "count") && json["count"] > 100) error("Value above maximum");
     retval.count = json["count"];
+    if (has_index(json, "label") && sizeof(json["label"]) < 2) error("String too short");
+    if (has_index(json, "label") && sizeof(json["label"]) > 16) error("String too long");
     retval.label = json["label"];
     retval.required_coordinates = json["requiredCoordinates"];
+    if (json["requiredCount"] < 1) error("Value below minimum");
+    if (json["requiredCount"] > 100) error("Value above maximum");
     retval.required_count = json["requiredCount"];
+    if (sizeof(json["requiredLabel"]) < 2) error("String too short");
+    if (sizeof(json["requiredLabel"]) > 16) error("String too long");
     retval.required_label = json["requiredLabel"];
+    if (has_index(json, "weight") && json["weight"] < 0.5) error("Value below minimum");
+    if (has_index(json, "weight") && json["weight"] > 99.5) error("Value above maximum");
     retval.weight = json["weight"];
 
     return retval;
diff --git a/base/schema-pike/test/inputs/schema/optional-constraints.schema/default/TopLevel.pmod b/head/schema-pike/test/inputs/schema/optional-constraints.schema/default/TopLevel.pmod
index b3aba94..237d8e1 100644
--- a/base/schema-pike/test/inputs/schema/optional-constraints.schema/default/TopLevel.pmod
+++ b/head/schema-pike/test/inputs/schema/optional-constraints.schema/default/TopLevel.pmod
@@ -35,10 +35,18 @@ class TopLevel {
 TopLevel TopLevel_from_JSON(mixed json) {
     TopLevel retval = TopLevel();
 
+    if (has_index(json, "optDouble") && json["optDouble"] < 0.5) error("Value below minimum");
+    if (has_index(json, "optDouble") && json["optDouble"] > 99.5) error("Value above maximum");
     retval.opt_double = json["optDouble"];
+    if (has_index(json, "optInt") && json["optInt"] < 0) error("Value below minimum");
+    if (has_index(json, "optInt") && json["optInt"] > 100) error("Value above maximum");
     retval.opt_int = json["optInt"];
     retval.opt_pattern = json["optPattern"];
+    if (has_index(json, "optString") && sizeof(json["optString"]) < 3) error("String too short");
+    if (has_index(json, "optString") && sizeof(json["optString"]) > 10) error("String too long");
     retval.opt_string = json["optString"];
+    if (json["reqZeroMin"] < 0) error("Value below minimum");
+    if (json["reqZeroMin"] > 100) error("Value above maximum");
     retval.req_zero_min = json["reqZeroMin"];
 
     return retval;
diff --git a/base/schema-pike/test/inputs/schema/renaming-bug.schema/default/TopLevel.pmod b/head/schema-pike/test/inputs/schema/renaming-bug.schema/default/TopLevel.pmod
index bbe9894..bbfd1aa 100644
--- a/base/schema-pike/test/inputs/schema/renaming-bug.schema/default/TopLevel.pmod
+++ b/head/schema-pike/test/inputs/schema/renaming-bug.schema/default/TopLevel.pmod
@@ -85,6 +85,7 @@ Berry Berry_from_JSON(mixed json) {
 
     if (has_index(json, "color") && json["color"] != Val.null) Color_from_JSON(json["color"]);
     retval.color = json["color"];
+    if (has_index(json, "name") && sizeof(json["name"]) < 1) error("String too short");
     retval.name = json["name"];
     retval.shapes = json["shapes"];
 
@@ -272,6 +273,7 @@ Vehicle Vehicle_from_JSON(mixed json) {
     Vehicle retval = Vehicle();
 
     retval.brand = json["brand"];
+    if (has_index(json, "id") && sizeof(json["id"]) < 1) error("String too short");
     retval.id = json["id"];
     if (has_index(json, "speed") && json["speed"] != Val.null) Speed_from_JSON(json["speed"]);
     retval.speed = json["speed"];
diff --git a/base/schema-pike/test/inputs/schema/schema-constraints.schema/default/TopLevel.pmod b/head/schema-pike/test/inputs/schema/schema-constraints.schema/default/TopLevel.pmod
index b868561..efd43ca 100644
--- a/base/schema-pike/test/inputs/schema/schema-constraints.schema/default/TopLevel.pmod
+++ b/head/schema-pike/test/inputs/schema/schema-constraints.schema/default/TopLevel.pmod
@@ -29,7 +29,11 @@ class TopLevel {
 TopLevel TopLevel_from_JSON(mixed json) {
     TopLevel retval = TopLevel();
 
+    if (sizeof(json["minMaxLength"]) < 5) error("String too short");
+    if (sizeof(json["minMaxLength"]) > 5) error("String too long");
     retval.min_max_length = json["minMaxLength"];
+    if (json["percent"] < 0) error("Value below minimum");
+    if (json["percent"] > 1) error("Value above maximum");
     retval.percent = (float)json["percent"];
 
     return retval;
diff --git a/base/schema-pike/test/inputs/schema/vega-lite.schema/default/TopLevel.pmod b/head/schema-pike/test/inputs/schema/vega-lite.schema/default/TopLevel.pmod
index 3af12c9..9904c69 100644
--- a/base/schema-pike/test/inputs/schema/vega-lite.schema/default/TopLevel.pmod
+++ b/head/schema-pike/test/inputs/schema/vega-lite.schema/default/TopLevel.pmod
@@ -418,6 +418,8 @@ MarkConfig MarkConfig_from_JSON(mixed json) {
     MarkConfig retval = MarkConfig();
 
     retval.align = HorizontalAlign_from_JSON(json["align"]);
+    if (has_index(json, "angle") && json["angle"] < 0) error("Value below minimum");
+    if (has_index(json, "angle") && json["angle"] > 360) error("Value above maximum");
     retval.angle = json["angle"];
     retval.baseline = VerticalAlign_from_JSON(json["baseline"]);
     retval.color = json["color"];
@@ -426,8 +428,11 @@ MarkConfig MarkConfig_from_JSON(mixed json) {
     retval.dy = json["dy"];
     retval.fill = json["fill"];
     retval.filled = json["filled"];
+    if (has_index(json, "fillOpacity") && json["fillOpacity"] < 0) error("Value below minimum");
+    if (has_index(json, "fillOpacity") && json["fillOpacity"] > 1) error("Value above maximum");
     retval.fill_opacity = json["fillOpacity"];
     retval.font = json["font"];
+    if (has_index(json, "fontSize") && json["fontSize"] < 0) error("Value below minimum");
     retval.font_size = json["fontSize"];
     retval.font_style = FontStyle_from_JSON(json["fontStyle"]);
     if (arrayp(json["fontWeight"])) error("Unexpected array");
@@ -435,16 +440,25 @@ MarkConfig MarkConfig_from_JSON(mixed json) {
     retval.href = json["href"];
     retval.interpolate = Interpolate_from_JSON(json["interpolate"]);
     retval.limit = json["limit"];
+    if (has_index(json, "opacity") && json["opacity"] < 0) error("Value below minimum");
+    if (has_index(json, "opacity") && json["opacity"] > 1) error("Value above maximum");
     retval.opacity = json["opacity"];
     retval.orient = Orient_from_JSON(json["orient"]);
+    if (has_index(json, "radius") && json["radius"] < 0) error("Value below minimum");
     retval.radius = json["radius"];
     retval.shape = json["shape"];
+    if (has_index(json, "size") && json["size"] < 0) error("Value below minimum");
     retval.size = json["size"];
     retval.stroke = json["stroke"];
     retval.stroke_dash = json["strokeDash"];
     retval.stroke_dash_offset = json["strokeDashOffset"];
+    if (has_index(json, "strokeOpacity") && json["strokeOpacity"] < 0) error("Value below minimum");
+    if (has_index(json, "strokeOpacity") && json["strokeOpacity"] > 1) error("Value above maximum");
     retval.stroke_opacity = json["strokeOpacity"];
+    if (has_index(json, "strokeWidth") && json["strokeWidth"] < 0) error("Value below minimum");
     retval.stroke_width = json["strokeWidth"];
+    if (has_index(json, "tension") && json["tension"] < 0) error("Value below minimum");
+    if (has_index(json, "tension") && json["tension"] > 1) error("Value above maximum");
     retval.tension = json["tension"];
     retval.text = json["text"];
     retval.theta = json["theta"];
@@ -672,8 +686,13 @@ AxisConfig AxisConfig_from_JSON(mixed json) {
     retval.grid = json["grid"];
     retval.grid_color = json["gridColor"];
     retval.grid_dash = json["gridDash"];
+    if (has_index(json, "gridOpacity") && json["gridOpacity"] < 0) error("Value below minimum");
+    if (has_index(json, "gridOpacity") && json["gridOpacity"] > 1) error("Value above maximum");
     retval.grid_opacity = json["gridOpacity"];
+    if (has_index(json, "gridWidth") && json["gridWidth"] < 0) error("Value below minimum");
     retval.grid_width = json["gridWidth"];
+    if (has_index(json, "labelAngle") && json["labelAngle"] < -360) error("Value below minimum");
+    if (has_index(json, "labelAngle") && json["labelAngle"] > 360) error("Value above maximum");
     retval.label_angle = json["labelAngle"];
     if (arrayp(json["labelBound"])) error("Unexpected array");
     retval.label_bound = json["labelBound"];
@@ -681,6 +700,7 @@ AxisConfig AxisConfig_from_JSON(mixed json) {
     if (arrayp(json["labelFlush"])) error("Unexpected array");
     retval.label_flush = json["labelFlush"];
     retval.label_font = json["labelFont"];
+    if (has_index(json, "labelFontSize") && json["labelFontSize"] < 0) error("Value below minimum");
     retval.label_font_size = json["labelFontSize"];
     retval.label_limit = json["labelLimit"];
     if (arrayp(json["labelOverlap"])) error("Unexpected array");
@@ -693,13 +713,16 @@ AxisConfig AxisConfig_from_JSON(mixed json) {
     retval.tick_color = json["tickColor"];
     retval.tick_round = json["tickRound"];
     retval.ticks = json["ticks"];
+    if (has_index(json, "tickSize") && json["tickSize"] < 0) error("Value below minimum");
     retval.tick_size = json["tickSize"];
+    if (has_index(json, "tickWidth") && json["tickWidth"] < 0) error("Value below minimum");
     retval.tick_width = json["tickWidth"];
     retval.title_align = json["titleAlign"];
     retval.title_angle = json["titleAngle"];
     retval.title_baseline = json["titleBaseline"];
     retval.title_color = json["titleColor"];
     retval.title_font = json["titleFont"];
+    if (has_index(json, "titleFontSize") && json["titleFontSize"] < 0) error("Value below minimum");
     retval.title_font_size = json["titleFontSize"];
     if (arrayp(json["titleFontWeight"])) error("Unexpected array");
     retval.title_font_weight = json["titleFontWeight"];
@@ -868,8 +891,13 @@ VgAxisConfig VgAxisConfig_from_JSON(mixed json) {
     retval.grid = json["grid"];
     retval.grid_color = json["gridColor"];
     retval.grid_dash = json["gridDash"];
+    if (has_index(json, "gridOpacity") && json["gridOpacity"] < 0) error("Value below minimum");
+    if (has_index(json, "gridOpacity") && json["gridOpacity"] > 1) error("Value above maximum");
     retval.grid_opacity = json["gridOpacity"];
+    if (has_index(json, "gridWidth") && json["gridWidth"] < 0) error("Value below minimum");
     retval.grid_width = json["gridWidth"];
+    if (has_index(json, "labelAngle") && json["labelAngle"] < -360) error("Value below minimum");
+    if (has_index(json, "labelAngle") && json["labelAngle"] > 360) error("Value above maximum");
     retval.label_angle = json["labelAngle"];
     if (arrayp(json["labelBound"])) error("Unexpected array");
     retval.label_bound = json["labelBound"];
@@ -877,6 +905,7 @@ VgAxisConfig VgAxisConfig_from_JSON(mixed json) {
     if (arrayp(json["labelFlush"])) error("Unexpected array");
     retval.label_flush = json["labelFlush"];
     retval.label_font = json["labelFont"];
+    if (has_index(json, "labelFontSize") && json["labelFontSize"] < 0) error("Value below minimum");
     retval.label_font_size = json["labelFontSize"];
     retval.label_limit = json["labelLimit"];
     if (arrayp(json["labelOverlap"])) error("Unexpected array");
@@ -888,13 +917,16 @@ VgAxisConfig VgAxisConfig_from_JSON(mixed json) {
     retval.tick_color = json["tickColor"];
     retval.tick_round = json["tickRound"];
     retval.ticks = json["ticks"];
+    if (has_index(json, "tickSize") && json["tickSize"] < 0) error("Value below minimum");
     retval.tick_size = json["tickSize"];
+    if (has_index(json, "tickWidth") && json["tickWidth"] < 0) error("Value below minimum");
     retval.tick_width = json["tickWidth"];
     retval.title_align = json["titleAlign"];
     retval.title_angle = json["titleAngle"];
     retval.title_baseline = json["titleBaseline"];
     retval.title_color = json["titleColor"];
     retval.title_font = json["titleFont"];
+    if (has_index(json, "titleFontSize") && json["titleFontSize"] < 0) error("Value below minimum");
     retval.title_font_size = json["titleFontSize"];
     if (arrayp(json["titleFontWeight"])) error("Unexpected array");
     retval.title_font_weight = json["titleFontWeight"];
@@ -988,19 +1020,27 @@ BarConfig BarConfig_from_JSON(mixed json) {
     BarConfig retval = BarConfig();
 
     retval.align = HorizontalAlign_from_JSON(json["align"]);
+    if (has_index(json, "angle") && json["angle"] < 0) error("Value below minimum");
+    if (has_index(json, "angle") && json["angle"] > 360) error("Value above maximum");
     retval.angle = json["angle"];
     retval.baseline = VerticalAlign_from_JSON(json["baseline"]);
+    if (has_index(json, "binSpacing") && json["binSpacing"] < 0) error("Value below minimum");
     retval.bin_spacing = json["binSpacing"];
     retval.color = json["color"];
+    if (has_index(json, "continuousBandSize") && json["continuousBandSize"] < 0) error("Value below minimum");
     retval.continuous_band_size = json["continuousBandSize"];
     retval.cursor = Cursor_from_JSON(json["cursor"]);
+    if (has_index(json, "discreteBandSize") && json["discreteBandSize"] < 0) error("Value below minimum");
     retval.discrete_band_size = json["discreteBandSize"];
     retval.dx = json["dx"];
     retval.dy = json["dy"];
     retval.fill = json["fill"];
     retval.filled = json["filled"];
+    if (has_index(json, "fillOpacity") && json["fillOpacity"] < 0) error("Value below minimum");
+    if (has_index(json, "fillOpacity") && json["fillOpacity"] > 1) error("Value above maximum");
     retval.fill_opacity = json["fillOpacity"];
     retval.font = json["font"];
+    if (has_index(json, "fontSize") && json["fontSize"] < 0) error("Value below minimum");
     retval.font_size = json["fontSize"];
     retval.font_style = FontStyle_from_JSON(json["fontStyle"]);
     if (arrayp(json["fontWeight"])) error("Unexpected array");
@@ -1008,16 +1048,25 @@ BarConfig BarConfig_from_JSON(mixed json) {
     retval.href = json["href"];
     retval.interpolate = Interpolate_from_JSON(json["interpolate"]);
     retval.limit = json["limit"];
+    if (has_index(json, "opacity") && json["opacity"] < 0) error("Value below minimum");
+    if (has_index(json, "opacity") && json["opacity"] > 1) error("Value above maximum");
     retval.opacity = json["opacity"];
     retval.orient = Orient_from_JSON(json["orient"]);
+    if (has_index(json, "radius") && json["radius"] < 0) error("Value below minimum");
     retval.radius = json["radius"];
     retval.shape = json["shape"];
+    if (has_index(json, "size") && json["size"] < 0) error("Value below minimum");
     retval.size = json["size"];
     retval.stroke = json["stroke"];
     retval.stroke_dash = json["strokeDash"];
     retval.stroke_dash_offset = json["strokeDashOffset"];
+    if (has_index(json, "strokeOpacity") && json["strokeOpacity"] < 0) error("Value below minimum");
+    if (has_index(json, "strokeOpacity") && json["strokeOpacity"] > 1) error("Value above maximum");
     retval.stroke_opacity = json["strokeOpacity"];
+    if (has_index(json, "strokeWidth") && json["strokeWidth"] < 0) error("Value below minimum");
     retval.stroke_width = json["strokeWidth"];
+    if (has_index(json, "tension") && json["tension"] < 0) error("Value below minimum");
+    if (has_index(json, "tension") && json["tension"] > 1) error("Value above maximum");
     retval.tension = json["tension"];
     retval.text = json["text"];
     retval.theta = json["theta"];
@@ -1134,19 +1183,24 @@ LegendConfig LegendConfig_from_JSON(mixed json) {
     retval.corner_radius = json["cornerRadius"];
     retval.entry_padding = json["entryPadding"];
     retval.fill_color = json["fillColor"];
+    if (has_index(json, "gradientHeight") && json["gradientHeight"] < 0) error("Value below minimum");
     retval.gradient_height = json["gradientHeight"];
     retval.gradient_label_baseline = json["gradientLabelBaseline"];
     retval.gradient_label_limit = json["gradientLabelLimit"];
     retval.gradient_label_offset = json["gradientLabelOffset"];
     retval.gradient_stroke_color = json["gradientStrokeColor"];
+    if (has_index(json, "gradientStrokeWidth") && json["gradientStrokeWidth"] < 0) error("Value below minimum");
     retval.gradient_stroke_width = json["gradientStrokeWidth"];
+    if (has_index(json, "gradientWidth") && json["gradientWidth"] < 0) error("Value below minimum");
     retval.gradient_width = json["gradientWidth"];
     retval.label_align = json["labelAlign"];
     retval.label_baseline = json["labelBaseline"];
     retval.label_color = json["labelColor"];
     retval.label_font = json["labelFont"];
+    if (has_index(json, "labelFontSize") && json["labelFontSize"] < 0) error("Value below minimum");
     retval.label_font_size = json["labelFontSize"];
     retval.label_limit = json["labelLimit"];
+    if (has_index(json, "labelOffset") && json["labelOffset"] < 0) error("Value below minimum");
     retval.label_offset = json["labelOffset"];
     retval.offset = json["offset"];
     retval.orient = LegendOrient_from_JSON(json["orient"]);
@@ -1156,7 +1210,9 @@ LegendConfig LegendConfig_from_JSON(mixed json) {
     retval.stroke_dash = json["strokeDash"];
     retval.stroke_width = json["strokeWidth"];
     retval.symbol_color = json["symbolColor"];
+    if (has_index(json, "symbolSize") && json["symbolSize"] < 0) error("Value below minimum");
     retval.symbol_size = json["symbolSize"];
+    if (has_index(json, "symbolStrokeWidth") && json["symbolStrokeWidth"] < 0) error("Value below minimum");
     retval.symbol_stroke_width = json["symbolStrokeWidth"];
     retval.symbol_type = json["symbolType"];
     retval.title_align = json["titleAlign"];
@@ -1413,23 +1469,43 @@ class ScaleConfig {
 ScaleConfig ScaleConfig_from_JSON(mixed json) {
     ScaleConfig retval = ScaleConfig();
 
+    if (has_index(json, "bandPaddingInner") && json["bandPaddingInner"] < 0) error("Value below minimum");
+    if (has_index(json, "bandPaddingInner") && json["bandPaddingInner"] > 1) error("Value above maximum");
     retval.band_padding_inner = json["bandPaddingInner"];
+    if (has_index(json, "bandPaddingOuter") && json["bandPaddingOuter"] < 0) error("Value below minimum");
+    if (has_index(json, "bandPaddingOuter") && json["bandPaddingOuter"] > 1) error("Value above maximum");
     retval.band_padding_outer = json["bandPaddingOuter"];
     retval.clamp = json["clamp"];
+    if (has_index(json, "continuousPadding") && json["continuousPadding"] < 0) error("Value below minimum");
     retval.continuous_padding = json["continuousPadding"];
+    if (has_index(json, "maxBandSize") && json["maxBandSize"] < 0) error("Value below minimum");
     retval.max_band_size = json["maxBandSize"];
+    if (has_index(json, "maxFontSize") && json["maxFontSize"] < 0) error("Value below minimum");
     retval.max_font_size = json["maxFontSize"];
+    if (has_index(json, "maxOpacity") && json["maxOpacity"] < 0) error("Value below minimum");
+    if (has_index(json, "maxOpacity") && json["maxOpacity"] > 1) error("Value above maximum");
     retval.max_opacity = json["maxOpacity"];
+    if (has_index(json, "maxSize") && json["maxSize"] < 0) error("Value below minimum");
     retval.max_size = json["maxSize"];
+    if (has_index(json, "maxStrokeWidth") && json["maxStrokeWidth"] < 0) error("Value below minimum");
     retval.max_stroke_width = json["maxStrokeWidth"];
+    if (has_index(json, "minBandSize") && json["minBandSize"] < 0) error("Value below minimum");
     retval.min_band_size = json["minBandSize"];
+    if (has_index(json, "minFontSize") && json["minFontSize"] < 0) error("Value below minimum");
     retval.min_font_size = json["minFontSize"];
+    if (has_index(json, "minOpacity") && json["minOpacity"] < 0) error("Value below minimum");
+    if (has_index(json, "minOpacity") && json["minOpacity"] > 1) error("Value above maximum");
     retval.min_opacity = json["minOpacity"];
+    if (has_index(json, "minSize") && json["minSize"] < 0) error("Value below minimum");
     retval.min_size = json["minSize"];
+    if (has_index(json, "minStrokeWidth") && json["minStrokeWidth"] < 0) error("Value below minimum");
     retval.min_stroke_width = json["minStrokeWidth"];
+    if (has_index(json, "pointPadding") && json["pointPadding"] < 0) error("Value below minimum");
+    if (has_index(json, "pointPadding") && json["pointPadding"] > 1) error("Value above maximum");
     retval.point_padding = json["pointPadding"];
     retval.range_step = json["rangeStep"];
     retval.round = json["round"];
+    if (has_index(json, "textXRangeStep") && json["textXRangeStep"] < 0) error("Value below minimum");
     retval.text_x_range_step = json["textXRangeStep"];
     retval.use_unaggregated_domain = json["useUnaggregatedDomain"];
 
@@ -1842,14 +1918,19 @@ VgMarkConfig VgMarkConfig_from_JSON(mixed json) {
     VgMarkConfig retval = VgMarkConfig();
 
     retval.align = HorizontalAlign_from_JSON(json["align"]);
+    if (has_index(json, "angle") && json["angle"] < 0) error("Value below minimum");
+    if (has_index(json, "angle") && json["angle"] > 360) error("Value above maximum");
     retval.angle = json["angle"];
     retval.baseline = VerticalAlign_from_JSON(json["baseline"]);
     retval.cursor = Cursor_from_JSON(json["cursor"]);
     retval.dx = json["dx"];
     retval.dy = json["dy"];
     retval.fill = json["fill"];
+    if (has_index(json, "fillOpacity") && json["fillOpacity"] < 0) error("Value below minimum");
+    if (has_index(json, "fillOpacity") && json["fillOpacity"] > 1) error("Value above maximum");
     retval.fill_opacity = json["fillOpacity"];
     retval.font = json["font"];
+    if (has_index(json, "fontSize") && json["fontSize"] < 0) error("Value below minimum");
     retval.font_size = json["fontSize"];
     retval.font_style = FontStyle_from_JSON(json["fontStyle"]);
     if (arrayp(json["fontWeight"])) error("Unexpected array");
@@ -1857,16 +1938,25 @@ VgMarkConfig VgMarkConfig_from_JSON(mixed json) {
     retval.href = json["href"];
     retval.interpolate = Interpolate_from_JSON(json["interpolate"]);
     retval.limit = json["limit"];
+    if (has_index(json, "opacity") && json["opacity"] < 0) error("Value below minimum");
+    if (has_index(json, "opacity") && json["opacity"] > 1) error("Value above maximum");
     retval.opacity = json["opacity"];
     retval.orient = Orient_from_JSON(json["orient"]);
+    if (has_index(json, "radius") && json["radius"] < 0) error("Value below minimum");
     retval.radius = json["radius"];
     retval.shape = json["shape"];
+    if (has_index(json, "size") && json["size"] < 0) error("Value below minimum");
     retval.size = json["size"];
     retval.stroke = json["stroke"];
     retval.stroke_dash = json["strokeDash"];
     retval.stroke_dash_offset = json["strokeDashOffset"];
+    if (has_index(json, "strokeOpacity") && json["strokeOpacity"] < 0) error("Value below minimum");
+    if (has_index(json, "strokeOpacity") && json["strokeOpacity"] > 1) error("Value above maximum");
     retval.stroke_opacity = json["strokeOpacity"];
+    if (has_index(json, "strokeWidth") && json["strokeWidth"] < 0) error("Value below minimum");
     retval.stroke_width = json["strokeWidth"];
+    if (has_index(json, "tension") && json["tension"] < 0) error("Value below minimum");
+    if (has_index(json, "tension") && json["tension"] > 1) error("Value above maximum");
     retval.tension = json["tension"];
     retval.text = json["text"];
     retval.theta = json["theta"];
@@ -1951,6 +2041,8 @@ TextConfig TextConfig_from_JSON(mixed json) {
     TextConfig retval = TextConfig();
 
     retval.align = HorizontalAlign_from_JSON(json["align"]);
+    if (has_index(json, "angle") && json["angle"] < 0) error("Value below minimum");
+    if (has_index(json, "angle") && json["angle"] > 360) error("Value above maximum");
     retval.angle = json["angle"];
     retval.baseline = VerticalAlign_from_JSON(json["baseline"]);
     retval.color = json["color"];
@@ -1959,8 +2051,11 @@ TextConfig TextConfig_from_JSON(mixed json) {
     retval.dy = json["dy"];
     retval.fill = json["fill"];
     retval.filled = json["filled"];
+    if (has_index(json, "fillOpacity") && json["fillOpacity"] < 0) error("Value below minimum");
+    if (has_index(json, "fillOpacity") && json["fillOpacity"] > 1) error("Value above maximum");
     retval.fill_opacity = json["fillOpacity"];
     retval.font = json["font"];
+    if (has_index(json, "fontSize") && json["fontSize"] < 0) error("Value below minimum");
     retval.font_size = json["fontSize"];
     retval.font_style = FontStyle_from_JSON(json["fontStyle"]);
     if (arrayp(json["fontWeight"])) error("Unexpected array");
@@ -1968,17 +2063,26 @@ TextConfig TextConfig_from_JSON(mixed json) {
     retval.href = json["href"];
     retval.interpolate = Interpolate_from_JSON(json["interpolate"]);
     retval.limit = json["limit"];
+    if (has_index(json, "opacity") && json["opacity"] < 0) error("Value below minimum");
+    if (has_index(json, "opacity") && json["opacity"] > 1) error("Value above maximum");
     retval.opacity = json["opacity"];
     retval.orient = Orient_from_JSON(json["orient"]);
+    if (has_index(json, "radius") && json["radius"] < 0) error("Value below minimum");
     retval.radius = json["radius"];
     retval.shape = json["shape"];
     retval.short_time_labels = json["shortTimeLabels"];
+    if (has_index(json, "size") && json["size"] < 0) error("Value below minimum");
     retval.size = json["size"];
     retval.stroke = json["stroke"];
     retval.stroke_dash = json["strokeDash"];
     retval.stroke_dash_offset = json["strokeDashOffset"];
+    if (has_index(json, "strokeOpacity") && json["strokeOpacity"] < 0) error("Value below minimum");
+    if (has_index(json, "strokeOpacity") && json["strokeOpacity"] > 1) error("Value above maximum");
     retval.stroke_opacity = json["strokeOpacity"];
+    if (has_index(json, "strokeWidth") && json["strokeWidth"] < 0) error("Value below minimum");
     retval.stroke_width = json["strokeWidth"];
+    if (has_index(json, "tension") && json["tension"] < 0) error("Value below minimum");
+    if (has_index(json, "tension") && json["tension"] > 1) error("Value above maximum");
     retval.tension = json["tension"];
     retval.text = json["text"];
     retval.theta = json["theta"];
@@ -2065,7 +2169,10 @@ TickConfig TickConfig_from_JSON(mixed json) {
     TickConfig retval = TickConfig();
 
     retval.align = HorizontalAlign_from_JSON(json["align"]);
+    if (has_index(json, "angle") && json["angle"] < 0) error("Value below minimum");
+    if (has_index(json, "angle") && json["angle"] > 360) error("Value above maximum");
     retval.angle = json["angle"];
+    if (has_index(json, "bandSize") && json["bandSize"] < 0) error("Value below minimum");
     retval.band_size = json["bandSize"];
     retval.baseline = VerticalAlign_from_JSON(json["baseline"]);
     retval.color = json["color"];
@@ -2074,8 +2181,11 @@ TickConfig TickConfig_from_JSON(mixed json) {
     retval.dy = json["dy"];
     retval.fill = json["fill"];
     retval.filled = json["filled"];
+    if (has_index(json, "fillOpacity") && json["fillOpacity"] < 0) error("Value below minimum");
+    if (has_index(json, "fillOpacity") && json["fillOpacity"] > 1) error("Value above maximum");
     retval.fill_opacity = json["fillOpacity"];
     retval.font = json["font"];
+    if (has_index(json, "fontSize") && json["fontSize"] < 0) error("Value below minimum");
     retval.font_size = json["fontSize"];
     retval.font_style = FontStyle_from_JSON(json["fontStyle"]);
     if (arrayp(json["fontWeight"])) error("Unexpected array");
@@ -2083,19 +2193,29 @@ TickConfig TickConfig_from_JSON(mixed json) {
     retval.href = json["href"];
     retval.interpolate = Interpolate_from_JSON(json["interpolate"]);
     retval.limit = json["limit"];
+    if (has_index(json, "opacity") && json["opacity"] < 0) error("Value below minimum");
+    if (has_index(json, "opacity") && json["opacity"] > 1) error("Value above maximum");
     retval.opacity = json["opacity"];
     retval.orient = Orient_from_JSON(json["orient"]);
+    if (has_index(json, "radius") && json["radius"] < 0) error("Value below minimum");
     retval.radius = json["radius"];
     retval.shape = json["shape"];
+    if (has_index(json, "size") && json["size"] < 0) error("Value below minimum");
     retval.size = json["size"];
     retval.stroke = json["stroke"];
     retval.stroke_dash = json["strokeDash"];
     retval.stroke_dash_offset = json["strokeDashOffset"];
+    if (has_index(json, "strokeOpacity") && json["strokeOpacity"] < 0) error("Value below minimum");
+    if (has_index(json, "strokeOpacity") && json["strokeOpacity"] > 1) error("Value above maximum");
     retval.stroke_opacity = json["strokeOpacity"];
+    if (has_index(json, "strokeWidth") && json["strokeWidth"] < 0) error("Value below minimum");
     retval.stroke_width = json["strokeWidth"];
+    if (has_index(json, "tension") && json["tension"] < 0) error("Value below minimum");
+    if (has_index(json, "tension") && json["tension"] > 1) error("Value above maximum");
     retval.tension = json["tension"];
     retval.text = json["text"];
     retval.theta = json["theta"];
+    if (has_index(json, "thickness") && json["thickness"] < 0) error("Value below minimum");
     retval.thickness = json["thickness"];
 
     return retval;
@@ -2142,9 +2262,11 @@ VgTitleConfig VgTitleConfig_from_JSON(mixed json) {
     retval.baseline = VerticalAlign_from_JSON(json["baseline"]);
     retval.color = json["color"];
     retval.font = json["font"];
+    if (has_index(json, "fontSize") && json["fontSize"] < 0) error("Value below minimum");
     retval.font_size = json["fontSize"];
     if (arrayp(json["fontWeight"])) error("Unexpected array");
     retval.font_weight = json["fontWeight"];
+    if (has_index(json, "limit") && json["limit"] < 0) error("Value below minimum");
     retval.limit = json["limit"];
     retval.offset = json["offset"];
     retval.orient = TitleOrient_from_JSON(json["orient"]);
@@ -2570,6 +2692,7 @@ BinParams BinParams_from_JSON(mixed json) {
     retval.base = json["base"];
     retval.divide = json["divide"];
     retval.extent = json["extent"];
+    if (has_index(json, "maxbins") && json["maxbins"] < 2) error("Value below minimum");
     retval.maxbins = json["maxbins"];
     retval.minstep = json["minstep"];
     retval.nice = json["nice"];
@@ -2780,15 +2903,27 @@ class DateTime {
 DateTime DateTime_from_JSON(mixed json) {
     DateTime retval = DateTime();
 
+    if (has_index(json, "date") && json["date"] < 1) error("Value below minimum");
+    if (has_index(json, "date") && json["date"] > 31) error("Value above maximum");
     retval.date = json["date"];
     if (arrayp(json["day"])) error("Unexpected array");
     retval.day = json["day"];
+    if (has_index(json, "hours") && json["hours"] < 0) error("Value below minimum");
+    if (has_index(json, "hours") && json["hours"] > 23) error("Value above maximum");
     retval.hours = json["hours"];
+    if (has_index(json, "milliseconds") && json["milliseconds"] < 0) error("Value below minimum");
+    if (has_index(json, "milliseconds") && json["milliseconds"] > 999) error("Value above maximum");
     retval.milliseconds = json["milliseconds"];
+    if (has_index(json, "minutes") && json["minutes"] < 0) error("Value below minimum");
+    if (has_index(json, "minutes") && json["minutes"] > 59) error("Value above maximum");
     retval.minutes = json["minutes"];
     if (arrayp(json["month"])) error("Unexpected array");
     retval.month = json["month"];
+    if (has_index(json, "quarter") && json["quarter"] < 1) error("Value below minimum");
+    if (has_index(json, "quarter") && json["quarter"] > 4) error("Value above maximum");
     retval.quarter = json["quarter"];
+    if (has_index(json, "seconds") && json["seconds"] < 0) error("Value below minimum");
+    if (has_index(json, "seconds") && json["seconds"] > 59) error("Value above maximum");
     retval.seconds = json["seconds"];
     retval.utc = json["utc"];
     retval.year = json["year"];
@@ -3027,6 +3162,7 @@ Legend Legend_from_JSON(mixed json) {
     retval.title = json["title"];
     retval.type = LegendType_from_JSON(json["type"]);
     retval.values = json["values"];
+    if (has_index(json, "zindex") && json["zindex"] < 0) error("Value below minimum");
     retval.zindex = json["zindex"];
 
     return retval;
@@ -3103,8 +3239,13 @@ Scale Scale_from_JSON(mixed json) {
     retval.interpolate = json["interpolate"];
     if (arrayp(json["nice"])) error("Unexpected array");
     retval.nice = json["nice"];
+    if (has_index(json, "padding") && json["padding"] < 0) error("Value below minimum");
     retval.padding = json["padding"];
+    if (has_index(json, "paddingInner") && json["paddingInner"] < 0) error("Value below minimum");
+    if (has_index(json, "paddingInner") && json["paddingInner"] > 1) error("Value above maximum");
     retval.padding_inner = json["paddingInner"];
+    if (has_index(json, "paddingOuter") && json["paddingOuter"] < 0) error("Value below minimum");
+    if (has_index(json, "paddingOuter") && json["paddingOuter"] > 1) error("Value above maximum");
     retval.padding_outer = json["paddingOuter"];
     retval.range = json["range"];
     retval.range_step = json["rangeStep"];
@@ -3505,6 +3646,8 @@ Header Header_from_JSON(mixed json) {
     Header retval = Header();
 
     retval.format = json["format"];
+    if (has_index(json, "labelAngle") && json["labelAngle"] < -360) error("Value below minimum");
+    if (has_index(json, "labelAngle") && json["labelAngle"] > 360) error("Value above maximum");
     retval.label_angle = json["labelAngle"];
     retval.title = json["title"];
 
@@ -3935,6 +4078,8 @@ Axis Axis_from_JSON(mixed json) {
     retval.domain = json["domain"];
     retval.format = json["format"];
     retval.grid = json["grid"];
+    if (has_index(json, "labelAngle") && json["labelAngle"] < -360) error("Value below minimum");
+    if (has_index(json, "labelAngle") && json["labelAngle"] > 360) error("Value above maximum");
     retval.label_angle = json["labelAngle"];
     if (arrayp(json["labelBound"])) error("Unexpected array");
     retval.label_bound = json["labelBound"];
@@ -3951,11 +4096,13 @@ Axis Axis_from_JSON(mixed json) {
     retval.position = json["position"];
     retval.tick_count = json["tickCount"];
     retval.ticks = json["ticks"];
+    if (has_index(json, "tickSize") && json["tickSize"] < 0) error("Value below minimum");
     retval.tick_size = json["tickSize"];
     retval.title = json["title"];
     retval.title_max_length = json["titleMaxLength"];
     retval.title_padding = json["titlePadding"];
     retval.values = json["values"];
+    if (has_index(json, "zindex") && json["zindex"] < 0) error("Value below minimum");
     retval.zindex = json["zindex"];
 
     return retval;
@@ -4341,6 +4488,8 @@ MarkDef MarkDef_from_JSON(mixed json) {
     MarkDef retval = MarkDef();
 
     retval.align = HorizontalAlign_from_JSON(json["align"]);
+    if (has_index(json, "angle") && json["angle"] < 0) error("Value below minimum");
+    if (has_index(json, "angle") && json["angle"] > 360) error("Value above maximum");
     retval.angle = json["angle"];
     retval.baseline = VerticalAlign_from_JSON(json["baseline"]);
     retval.clip = json["clip"];
@@ -4350,8 +4499,11 @@ MarkDef MarkDef_from_JSON(mixed json) {
     retval.dy = json["dy"];
     retval.fill = json["fill"];
     retval.filled = json["filled"];
+    if (has_index(json, "fillOpacity") && json["fillOpacity"] < 0) error("Value below minimum");
+    if (has_index(json, "fillOpacity") && json["fillOpacity"] > 1) error("Value above maximum");
     retval.fill_opacity = json["fillOpacity"];
     retval.font = json["font"];
+    if (has_index(json, "fontSize") && json["fontSize"] < 0) error("Value below minimum");
     retval.font_size = json["fontSize"];
     retval.font_style = FontStyle_from_JSON(json["fontStyle"]);
     if (arrayp(json["fontWeight"])) error("Unexpected array");
@@ -4359,17 +4511,26 @@ MarkDef MarkDef_from_JSON(mixed json) {
     retval.href = json["href"];
     retval.interpolate = Interpolate_from_JSON(json["interpolate"]);
     retval.limit = json["limit"];
+    if (has_index(json, "opacity") && json["opacity"] < 0) error("Value below minimum");
+    if (has_index(json, "opacity") && json["opacity"] > 1) error("Value above maximum");
     retval.opacity = json["opacity"];
     retval.orient = Orient_from_JSON(json["orient"]);
+    if (has_index(json, "radius") && json["radius"] < 0) error("Value below minimum");
     retval.radius = json["radius"];
     retval.shape = json["shape"];
+    if (has_index(json, "size") && json["size"] < 0) error("Value below minimum");
     retval.size = json["size"];
     retval.stroke = json["stroke"];
     retval.stroke_dash = json["strokeDash"];
     retval.stroke_dash_offset = json["strokeDashOffset"];
+    if (has_index(json, "strokeOpacity") && json["strokeOpacity"] < 0) error("Value below minimum");
+    if (has_index(json, "strokeOpacity") && json["strokeOpacity"] > 1) error("Value above maximum");
     retval.stroke_opacity = json["strokeOpacity"];
+    if (has_index(json, "strokeWidth") && json["strokeWidth"] < 0) error("Value below minimum");
     retval.stroke_width = json["strokeWidth"];
     retval.style = json["style"];
+    if (has_index(json, "tension") && json["tension"] < 0) error("Value below minimum");
+    if (has_index(json, "tension") && json["tension"] > 1) error("Value above maximum");
     retval.tension = json["tension"];
     retval.text = json["text"];
     retval.theta = json["theta"];
