Check if a value is valid JSON.
- 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-valueThis 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 JSONconst invalidJson = { prop: 0n }
JSON.stringify(invalidJson) // Throws: Do not know how to serialize a BigIntconst invalidJson = { prop: '\n'.repeat(5e8) }
JSON.stringify(invalidJson) // Throws: Invalid string lengthconst invalidJson = { toJSON: () => ({ invalidJson }) }
JSON.stringify(invalidJson) // Throws: Maximum call stack size exceededconst invalidJson = {
prop: {
toJSON: () => {
throw new Error('example')
},
},
}
JSON.stringify(invalidJson) // Throws: exampleconst invalidJson = {
get prop() {
throw new Error('example')
},
}
JSON.stringify(invalidJson) // Throws: exampleconst invalidJson = new Proxy(
{ prop: true },
{
get: () => {
throw new Error('example')
},
},
)
JSON.stringify(invalidJson) // Throws: examplesafe-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!