201 lines
4.8 KiB
Markdown
201 lines
4.8 KiB
Markdown
|
# is-my-json-valid
|
||
|
|
||
|
A [JSONSchema](http://json-schema.org/) validator that uses code generation
|
||
|
to be extremely fast
|
||
|
|
||
|
```
|
||
|
npm install is-my-json-valid
|
||
|
```
|
||
|
|
||
|
It passes the entire JSONSchema v4 test suite except for `remoteRefs` and `maxLength`/`minLength` when using unicode surrogate pairs.
|
||
|
|
||
|
[![build status](http://img.shields.io/travis/mafintosh/is-my-json-valid.svg?style=flat)](http://travis-ci.org/mafintosh/is-my-json-valid)
|
||
|
|
||
|
## Usage
|
||
|
|
||
|
Simply pass a schema to compile it
|
||
|
|
||
|
``` js
|
||
|
var validator = require('is-my-json-valid')
|
||
|
|
||
|
var validate = validator({
|
||
|
required: true,
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
hello: {
|
||
|
required: true,
|
||
|
type: 'string'
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
|
||
|
console.log('should be valid', validate({hello: 'world'}))
|
||
|
console.log('should not be valid', validate({}))
|
||
|
|
||
|
// get the last list of errors by checking validate.errors
|
||
|
// the following will print [{field: 'data.hello', message: 'is required'}]
|
||
|
console.log(validate.errors)
|
||
|
```
|
||
|
|
||
|
You can also pass the schema as a string
|
||
|
|
||
|
``` js
|
||
|
var validate = validator('{"type": ... }')
|
||
|
```
|
||
|
|
||
|
Optionally you can use the require submodule to load a schema from `__dirname`
|
||
|
|
||
|
``` js
|
||
|
var validator = require('is-my-json-valid/require')
|
||
|
var validate = validator('my-schema.json')
|
||
|
```
|
||
|
|
||
|
## Custom formats
|
||
|
|
||
|
is-my-json-valid supports the formats specified in JSON schema v4 (such as date-time).
|
||
|
If you want to add your own custom formats pass them as the formats options to the validator
|
||
|
|
||
|
``` js
|
||
|
var validate = validator({
|
||
|
type: 'string',
|
||
|
required: true,
|
||
|
format: 'only-a'
|
||
|
}, {
|
||
|
formats: {
|
||
|
'only-a': /^a+$/
|
||
|
}
|
||
|
})
|
||
|
|
||
|
console.log(validate('aa')) // true
|
||
|
console.log(validate('ab')) // false
|
||
|
```
|
||
|
|
||
|
## External schemas
|
||
|
|
||
|
You can pass in external schemas that you reference using the `$ref` attribute as the `schemas` option
|
||
|
|
||
|
``` js
|
||
|
var ext = {
|
||
|
required: true,
|
||
|
type: 'string'
|
||
|
}
|
||
|
|
||
|
var schema = {
|
||
|
$ref: '#ext' // references another schema called ext
|
||
|
}
|
||
|
|
||
|
// pass the external schemas as an option
|
||
|
var validate = validator(schema, {schemas: {ext: ext}})
|
||
|
|
||
|
validate('hello') // returns true
|
||
|
validate(42) // return false
|
||
|
```
|
||
|
|
||
|
## Filtering away additional properties
|
||
|
|
||
|
is-my-json-valid supports filtering away properties not in the schema
|
||
|
|
||
|
``` js
|
||
|
var filter = validator.filter({
|
||
|
required: true,
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
hello: {type: 'string', required: true}
|
||
|
},
|
||
|
additionalProperties: false
|
||
|
})
|
||
|
|
||
|
var doc = {hello: 'world', notInSchema: true}
|
||
|
console.log(filter(doc)) // {hello: 'world'}
|
||
|
```
|
||
|
|
||
|
## Verbose mode outputs the value on errors
|
||
|
|
||
|
is-my-json-valid outputs the value causing an error when verbose is set to true
|
||
|
|
||
|
``` js
|
||
|
var validate = validator({
|
||
|
required: true,
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
hello: {
|
||
|
required: true,
|
||
|
type: 'string'
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
verbose: true
|
||
|
})
|
||
|
|
||
|
validate({hello: 100});
|
||
|
console.log(validate.errors) // {field: 'data.hello', message: 'is the wrong type', value: 100, type: 'string'}
|
||
|
```
|
||
|
|
||
|
## Greedy mode tries to validate as much as possible
|
||
|
|
||
|
By default is-my-json-valid bails on first validation error but when greedy is
|
||
|
set to true it tries to validate as much as possible:
|
||
|
|
||
|
``` js
|
||
|
var validate = validator({
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
x: {
|
||
|
type: 'number'
|
||
|
}
|
||
|
},
|
||
|
required: ['x', 'y']
|
||
|
}, {
|
||
|
greedy: true
|
||
|
});
|
||
|
|
||
|
validate({x: 'string'});
|
||
|
console.log(validate.errors) // [{field: 'data.y', message: 'is required'},
|
||
|
// {field: 'data.x', message: 'is the wrong type'}]
|
||
|
```
|
||
|
|
||
|
## Error messages
|
||
|
|
||
|
Here is a list of possible `message` values for errors:
|
||
|
|
||
|
* `is required`
|
||
|
* `is the wrong type`
|
||
|
* `has additional items`
|
||
|
* `must be FORMAT format` (FORMAT is the `format` property from the schema)
|
||
|
* `must be unique`
|
||
|
* `must be an enum value`
|
||
|
* `dependencies not set`
|
||
|
* `has additional properties`
|
||
|
* `referenced schema does not match`
|
||
|
* `negative schema matches`
|
||
|
* `pattern mismatch`
|
||
|
* `no schemas match`
|
||
|
* `no (or more than one) schemas match`
|
||
|
* `has a remainder`
|
||
|
* `has more properties than allowed`
|
||
|
* `has less properties than allowed`
|
||
|
* `has more items than allowed`
|
||
|
* `has less items than allowed`
|
||
|
* `has longer length than allowed`
|
||
|
* `has less length than allowed`
|
||
|
* `is less than minimum`
|
||
|
* `is more than maximum`
|
||
|
|
||
|
## Performance
|
||
|
|
||
|
is-my-json-valid uses code generation to turn your JSON schema into basic javascript code that is easily optimizeable by v8.
|
||
|
|
||
|
At the time of writing, is-my-json-valid is the __fastest validator__ when running
|
||
|
|
||
|
* [json-schema-benchmark](https://github.com/Muscula/json-schema-benchmark)
|
||
|
* [cosmicreals.com benchmark](http://cosmicrealms.com/blog/2014/08/29/benchmark-of-node-dot-js-json-validation-modules-part-3/)
|
||
|
* [jsck benchmark](https://github.com/pandastrike/jsck/issues/72#issuecomment-70992684)
|
||
|
* [themis benchmark](https://cdn.rawgit.com/playlyfe/themis/master/benchmark/results.html)
|
||
|
* [z-schema benchmark](https://rawgit.com/zaggino/z-schema/master/benchmark/results.html)
|
||
|
|
||
|
If you know any other relevant benchmarks open a PR and I'll add them.
|
||
|
|
||
|
## License
|
||
|
|
||
|
MIT
|