Skip to content

xtao-org/verifyjson.js

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

verifyjson.js

Verifies if the return value of JSON.parse conforms to a type constraint.

Supports simple and complex type constraints.

Useful for validation of unreliable JSON.

Installation

Node.js

npm install xtao-org/verifyjson.js#semver:0.1.0

Deno and the browser

Import from jsDelivr:

import {verifyJson} from 'https://cdn.jsdelivr.net/gh/xtao-org/verifyjson.js@v0.1.0/mod.js'

Quickstart

For example:

import {verifyJson} from 'https://cdn.jsdelivr.net/gh/xtao-org/verifyjson.js@v0.1.0/mod.js'

verifyJson(JSON.parse(`42`), ["exactly", 42]) === true
verifyJson(JSON.parse(`42`), ["number"]) === true
verifyJson(JSON.parse(`42`), ["any"]) === true

verifyJson(JSON.parse(`42`), ["string"]) === false
verifyJson(JSON.parse(`42`), ["boolean"]) === false
verifyJson(JSON.parse(`42`), ["null"]) === false

verifyJson(JSON.parse(`{"one": 1, "two": 2, "three": 3, "four": 42}`), [
  "object", {
    "one": ["number"], 
    "two": ["number"], 
    "three": ["union", [["number"], ["string"]]], 
    "four": ["exactly", 42]
  }
]) === true

Supported constraints

any

any matches any valid JSON value.

verifyJson(JSON.parse(`{"whatever": "works"}`), ["any"]) === true

exactly

exactly matches an exact JSON value.

verifyJson(JSON.parse(`"42"`), ["exactly", "42"]) === true
verifyJson(JSON.parse(`"42"`), ["exactly", 42]) === false

number

number matches any JSON number.

verifyJson(JSON.parse(`"42"`), ["number"]) === false
verifyJson(JSON.parse(`42`), ["number"]) === true

string

string matches any JSON string.

verifyJson(JSON.parse(`"42"`), ["string"]) === true
verifyJson(JSON.parse(`42`), ["string"]) === false

boolean

boolean matches true and false.

verifyJson(JSON.parse(`true`), ["boolean"]) === true
verifyJson(JSON.parse(`false`), ["boolean"]) === true
verifyJson(JSON.parse(`42`), ["boolean"]) === false

null

null matches only null.

verifyJson(JSON.parse(`null`), ["null"]) === true
verifyJson(JSON.parse(`false`), ["null"]) === false

array

array matches an array of given type.

verifyJson(JSON.parse(`[1, 2, 3, 42]`), ["array", ["number"]]) === true
verifyJson(JSON.parse(`[1, 2, 3, "42"]`), ["array", ["number"]]) === false

tuple

tuple matches an array which contains a number of values of specified types.

verifyJson(JSON.parse(`[1, 2, 3, 42]`), ["tuple", [["number"], ["number"], ["number"], ["number"]]]) === true
verifyJson(JSON.parse(`[1, 2, 3, "42"]`), ["tuple", [["number"], ["number"], ["number"], ["string"]]]) === true
verifyJson(JSON.parse(`[1, 2, 3, "42"]`), ["tuple", [["number"], ["number"], ["number"], ["number"]]]) === false
verifyJson(JSON.parse(`[1, 2, 3, 42]`), ["tuple", [["number"], ["number"], ["number"]]]) === false
verifyJson(JSON.parse(`[1, 2, 3, 42]`), ["tuple", [["number"], ["number"], ["number"], ["string"]]]) === false

object

object matches an object which contains only the properties with values of specified types.

verifyJson(JSON.parse(`{"one": 1, "two": 2, "three": 3, "four": 42}`), ["object", {"one": ["number"], "two": ["number"], "three": ["number"], "four": ["exactly", 42]}]) === true

union

union matches a value of any of the specified types.

verifyJson(JSON.parse(`42`), ["union", [["number"], ["string"]]]) === true
verifyJson(JSON.parse(`"42"`), ["union", [["number"], ["string"]]]) === true

MIT License

© 2022 xtao.org