A simple JSON Schema Validation
A basic JSON Schema Validator



> DISCLAIMER: This is a basic JSON Schema validator implementation,
it dont implement the full JSON Schema spec, so it's should never used in production.
For a faster and powerful JSON Schema validator, please use AJV
``sh`
npm install --save jsonschemav
`javascript
const JsonSchemav = require('jsonschemav')
const jsv = new JsonSchemav()
const schema = {
type: 'object',
properties: {
title: { type: 'string', minLength: 6 },
date: { type: 'string', format: 'date', default: 'now()' }
}
}
const data = { title: 'Hello, World!' }
const validator = jsv.compile(schema)
validator
.then((instance) => instance.validate(datta))
.then((parsedData) => {
// use parsedData instead data
console.log(parsedData)
// { title: 'Hello, World!',
// date: '2017-06-12T18:49:14.739Z' }
})
validator
.then((instance) => instance.validate('Hello'))
.catch((err) => {
console.error(err.errors)
// [ { keyword: 'minLength',
// size: 5,
// minLength: 6,
// message: 'not enough characters. must be greater than, or equal to, 6' } ]
})
validator
.then((instance) => instance.validate(true))
.catch((err) => {
console.error(err.errors)
// [ { keyword: 'type', message: 'invalid type input' } ]
})
`
`javascript
const axios = require('axios')
const JsonSchemav = require('jsonschemav')
const jsv = new JsonSchemav()
const schema = { type: 'string', isTwitterAccount: true }
const endpoint = 'https://twitter.com/users/username_available'
const validationFn = (value, data) => {
// value is the keyword value
// data.value is the user data
if (value === true) {
return axios.get(${endpoint}?username=${data.value})The username '${data.value}' does not exists
.then((response) => {
if (response.data.valid) {
const message =
const err = new Error()
err.props = { message }
throw err
}
return Promise.resolve(data.value)
})
}
return true
}
jsv.addKeyword('string', 'isTwitterAccount', validationFn)
const validator = jsv.compile(schema)
validator
.then((instance) => instance.validate('nonexistingac'))
.catch((err) => {
console.error(err.errors)
// [ { message: 'The username \'nonexistingac\' does not exists',
// keyword: 'isTwitterAccount' } ]
})
validator
.then((instance) => instance.validate('demsking'))
.then((parsedData) => {
console.log('success')
})
`
#### Table of Contents
- validateSchema()
- compile()
- addCompileStep()
- addAlias()
- addType()
- removeType()
- addKeyword()
- removeKeyword()
Validate a schema. Throws an error for invalid schema
#### Parameters
- schema object Schema to validate
#### Examples
`javascript
const jsv = new JsonSchemav()
const schema = { type: 'string' }
try {
jsv.validateSchema(schema)
} catch (err) {
console.error(err)
}
`
Compile a schema
#### Parameters
- schema object Schema to compile
#### Examples
`javascript
const jsv = new JsonSchemav()
const schema = {
type: 'object',
properties: {
title: { type: 'string' },
date: { type: 'string', format: 'date', default: 'now()' }
}
}
const data = { title: 'Hello, World!' }
jsv.compile(schema)
.then((instance) => instance.validate(data))
.then((parsedData) => {
// use parsedData instead data`
console.log(parsedData)
// { title: 'Hello, World!',
// date: '2017-06-12T18:49:14.739Z' }
})
.catch((err) => {
console.error(err.errors) // a list of parsing error
})
Returns Promise Returns the validation interface on success and an error otherwise
Add a compile step function to a type
#### Parameters
- type string The name of the typecompileStepFn
- function A compile function
Add an alias for a type
#### Parameters
- type string The name of a defined typename
- string The alias name
#### Examples
`javascript
const jsv = new JsonSchemav()
const schema = { type: 'int' }
const data = 123
jsv.addAlias('integer', 'int')
jsv.compile(schema)
.then((instance) => instance.validate(data))
.then((parsedData) => {
// use parsedData instead data`
console.log(parsedData) // 123
})
.catch((err) => {
// err.errors is a list of parsing error
})
Add a new type to the instance
#### Parameters
- name string The name of the new typevalidateFn
- function? A validate function for the new type
#### Examples
`javascript
const jsv = new JsonSchemav()
const validateFn = (data) => {
return Number.isInteger(data.value) && /^[01]+$/.test(data.value.toString())
}
jsv.addType('binary', validateFn)
const schema = { type: 'binary' }
const data = 1111011
const instance = jsv.compile(schema)
jsv.compile(schema)
.then((instance) => instance.validate(data))
.then((parsedData) => {
// use parsedData instead data`
console.log(parsedData) // 1111011
})
Remove a type from the instance
#### Parameters
- name string The nema of the type
#### Examples
`javascript
const schema = { type: 'string' }
const jsv = new JsonSchemav()
jsv.removeType('string')
try {
jsv.validateSchema(schema)
} catch (err) {
console.error(err) // Error: Unknown type 'string'
}
`
Add a new keyword to a type
#### Parameters
- type string The name of the typename
- string The name of the new keywordvalidateFn
- function A validate function for the new keyword
#### Examples
`javascript
const jsv = new JsonSchemav()
const validateFn = function (value, data) {
// value is the keyword value
// data.value is the user data
// the function must returns:
// - true: for a success validation
// - false: for a faillure validate
// - an object { message, errors }
// - a Promise for async validation
return new Promise((resolve, reject) => {
//...
})
}
jsv.addKeyword('string', 'provider', validateFn)
// and then
const schema = {
type: 'object',
properties: {
account: { type: 'string', provider: 'twitter' }
}
}
`
Remove a keyword from a type
#### Parameters
- type string The name of the typename
- string The name of the keyword
#### Examples
`javascript
const jsv = new JsonSchemav()
jsv.removeKeyword('string', 'minLength')
const schema = { type: 'string', minLength: 5 }
const instance = jsv.compile(schema)
const data = 'abc'
jsv.compile(schema)
.then((instance) => instance.validate(data))
.then((parsedData) => {
// success
})
``
Under the MIT license. See LICENSE file for more details.