Search code examples
jsonvalidationjsonschemaangular-schema-form

How to validate string and number using json schema


I would like to validate a schema based on either its maximum/minimum (number) OR maximumLength/minimumLength (string). I have a json form:

[
  {
    "key":"foo",  
    "title":"Test",
    "type":"string" 
  }
]

and a json schema:

    {
 "type": "object",
  "properties": {
    "foo": {
        "type": ["number","string"],
        "maxLength":2,
        "minLength":0,
        "minimum":3,
        "maximum":10
    }
  }
}

and a json model:

{
  "foo": "bar"
}

Why does this example not work with validation? The model I have is not validated to false. According to this document it is possible to have different types defined in an array, but how can we do validation based on min/max values?


Solution

  • Your schema is correct. The validator you are using doesn't work properly. Here is an alternative that uses anyOf instead.

    {
        "type": "object",
        "properties": {
            "foo": {
                "anyOf": [
                    { "$ref": "#/definitions/boundedNumber" }
                    { "$ref": "#/definitions/boundedString" }
                ]
            }
        },
        "definitions": {
            "boundedString": {
                "type": "string",
                "maxLength": 2,
                "minLength": 0
            },
            "boundedNumber": {
                "type": "number",
                "minimum": 3,
                "maximum": 10
            }
        }
    }
    

    Although it is quite a bit longer, some would argue that this is actually easier to read/maintain because of the separation of the type specific keywords.