Fork me on GitHub

Numeric types

There are two numeric types in JSON Schema: integer and number. They share the same validation keywords.

Note

JSON has no standard way to represent complex numbers, so there is no way to test for them in JSON Schema.

integer

The integer type is used for integral numbers.

In Python, “integer” is analogous to the int type.
In Ruby, “integer” is analogous to the Integer type.
{ "type": "integer" }
42
-1

Floating point numbers are rejected:

3.1415926

Numbers as strings are rejected:

"42"

Warning

The precise treatment of the “integer” type may depend on the implementation of your JSON Schema validator. JavaScript (and thus also JSON) does not have distinct types for integers and floating-point values. Therefore, JSON Schema can not use type alone to distinguish between integers and non-integers. The JSON Schema specification recommends, but does not require, that validators use the mathematical value to determine whether a number is an integer, and not the type alone. Therefore, there is some disagreement between validators on this point. For example, a JavaScript-based may accept 1.0 as an integer, whereas the Python-based jsonschema does not.

Clever use of the multipleOf keyword (see Multiples) can be used to get around this discrepancy. For example, the following likely has the same behavior on all JSON Schema implementations:

{ "type": "number", "multipleOf": 1.0 }
42
42.0
3.14156926

number

The number type is used for any numeric type, either integers or floating point numbers.

In Python, “number” is analogous to the float type.
In Ruby, “number” is analogous to the Float type.
{ "type": "number" }
42
-1

Simple floating point number:

5.0

Exponential notation also works:

2.99792458e8

Numbers as strings are rejected:

"42"

Multiples

Numbers can be restricted to a multiple of a given number, using the multipleOf keyword. It may be set to any positive number.

{
    "type"       : "number",
    "multipleOf" : 10
}
0
10
20

Not a multiple of 10:

23

Range

Ranges of numbers are specified using a combination of the minimum, maximum, exclusiveMinimum and exclusiveMaximum keywords.

  • minimum specifies a minimum numeric value.
  • exclusiveMinimum is a boolean. When true, it indicates that the range excludes the minimum value, i.e., \(x > \mathrm{min}\). When false (or not included), it indicates that the range includes the minimum value, i.e., \(x \ge \mathrm{min}\).
  • maximum specifies a maximum numeric value.
  • exclusiveMaximum is a boolean. When true, it indicates that the range excludes the maximum value, i.e., \(x < \mathrm{max}\). When false (or not included), it indicates that the range includes the maximum value, i.e., \(x \le \mathrm{max}\).
{
  "type": "number",
  "minimum": 0,
  "maximum": 100,
  "exclusiveMaximum": true
}

Less than minimum:

-1

exclusiveMinimum was not specified, so 0 is included:

0
10
99

exclusiveMaximum is true, so 100 is not included:

100

Greater than maximum:

101