Check if a value is valid JSON.
Please reach out if you're looking for a Node.js API or CLI engineer (11 years of experience). Most recently I have been Netlify Build's and Netlify Plugins' technical lead for 2.5 years. I am available for full-time remote positions.
- Detects many types of invalid values with JSON
- Returns warning messages to throw or log
- Returns invalid properties' path and value
import isJsonValue from 'is-json-value'
const input = { one: true, two: { three: Symbol() } }
input.self = input
// Throws due to cycle with 'self'.
// Also, 'two.three' would be omitted since it has an invalid JSON type.
JSON.stringify(input)
const warnings = isJsonValue(input)
const isValidJson = warnings.length === 0 // false
console.log(warnings)
// [
// {
// message: 'Property "two.three" must not be a symbol.',
// path: ['two', 'three'],
// value: Symbol(),
// reason: 'ignoredSymbolValue'
// },
// {
// message: 'Property "self" must not be a circular value.',
// path: ['self'],
// value: <ref *1> { one: true, two: [Object], self: [Circular *1] },
// reason: 'unsafeCycle'
// }
// ]
if (!isValidJson) {
// Error: Property "two.three" must not be a symbol.
throw new Error(warnings[0].message)
}
npm install is-json-value
This package works in both Node.js >=18.18.0 and browsers.
This is an ES module. It must be loaded using
an import
or import()
statement,
not require()
. If TypeScript is used, it must be configured to
output ES modules,
not CommonJS.
input
any
Return value: Warning[]
Returns an array of warnings. If input
is valid to serialize as
JSON, that array is empty.
Each warning is an object indicating that a specific property is invalid to serialize as JSON. The same property might have multiple warnings.
Type: string
Warning message, like 'Property "example" must not be a symbol.'
Type: Array<string | symbol | number>
Path to the invalid property. Empty array if this is the top-level value.
Type: unknown
Value of the invalid property.
Type: string
Reason for the warning among:
- Invalid type:
"ignoredFunction"
,"ignoredUndefined"
,"ignoredSymbolValue"
,"ignoredSymbolKey"
,"unstableInfinite"
,"unresolvedClass"
,"ignoredNotEnumerable"
,"ignoredArrayProperty"
- Throws an exception:
"unsafeCycle"
,"unsafeBigInt"
,"unsafeSize"
,"unsafeException"
,"unsafeToJSON"
,"unsafeGetter"
This is the list of possible warnings.
JSON only supports booleans, numbers, strings, arrays, objects and null
. Any
other type is omitted or transformed by JSON.stringify()
.
const invalidJson = { prop: () => {} }
JSON.stringify(invalidJson) // '{}'
const invalidJson = { prop: undefined }
JSON.stringify(invalidJson) // '{}'
const invalidJson = { prop: Symbol() }
JSON.stringify(invalidJson) // '{}'
const invalidJson = { [Symbol()]: true }
JSON.stringify(invalidJson) // '{}'
const invalidJson = { one: Number.NaN, two: Number.POSITIVE_INFINITY }
JSON.stringify(invalidJson) // '{"one":null,"two":null}'
const invalidJson = { prop: new Set([]) }
JSON.stringify(invalidJson) // '{"prop":{}}'
const invalidJson = {}
Object.defineProperty(invalidJson, 'prop', { value: true, enumerable: false })
JSON.stringify(invalidJson) // '{}'
const invalidJson = []
invalidJson.prop = true
JSON.stringify(invalidJson) // '[]'
JSON.stringify()
can throw on specific properties.
const invalidJson = { prop: true }
invalidJson.self = invalidJson
JSON.stringify(invalidJson) // Throws: Converting circular structure to JSON
const invalidJson = { prop: 0n }
JSON.stringify(invalidJson) // Throws: Do not know how to serialize a BigInt
const invalidJson = { prop: '\n'.repeat(5e8) }
JSON.stringify(invalidJson) // Throws: Invalid string length
const invalidJson = { toJSON: () => ({ invalidJson }) }
JSON.stringify(invalidJson) // Throws: Maximum call stack size exceeded
const invalidJson = {
prop: {
toJSON: () => {
throw new Error('example')
},
},
}
JSON.stringify(invalidJson) // Throws: example
const invalidJson = {
get prop() {
throw new Error('example')
},
}
JSON.stringify(invalidJson) // Throws: example
const invalidJson = new Proxy(
{ prop: true },
{
get: () => {
throw new Error('example')
},
},
)
JSON.stringify(invalidJson) // Throws: example
safe-json-value
: ⛑️ JSON serialization should never failtruncate-json
: Truncate a JSON stringguess-json-indent
: Guess the indentation of a JSON string
For any question, don't hesitate to submit an issue on GitHub.
Everyone is welcome regardless of personal background. We enforce a Code of conduct in order to promote a positive and inclusive environment.
This project was made with ❤️. The simplest way to give back is by starring and sharing it online.
If the documentation is unclear or has a typo, please click on the page's Edit
button (pencil icon) and suggest a correction.
If you would like to help us fix a bug or add a new feature, please check our guidelines. Pull requests are welcome!