JSON.stringify[]
The JSON.stringify[] method converts a JavaScript object or value to a JSON string, optionally replacing values if a replacer function is specified or optionally including only the specified properties if a replacer array is specified.
Syntax
Parameters
The value to convert to a JSON string.
replacer OptionalA function that alters the behavior of the stringification process, or an array of String and Number that serve as an allowlist for selecting/filtering the properties of the value object to be included in the JSON string. If this value is null or not provided, all properties of the object are included in the resulting JSON string.
space OptionalA String or Number object that's used to insert white space [including indentation, line break characters, etc.] into the output JSON string for readability purposes.
If this is a Number, it indicates the number of space characters to use as white space for indenting purposes; this number is capped at 10 [if it is greater, the value is just 10]. Values less than 1 indicate that no space should be used.
If this is a String, the string [or the first 10 characters of the string, if it's longer than that] is used as white space.
If this parameter is not provided [or is null], no white space is used.
Return value
A JSON string representing the given value, or undefined.
Exceptions
- Throws a TypeError ["cyclic object value"] exception when a circular reference is found.
- Throws a TypeError ["BigInt value can't be serialized in JSON"] when trying to stringify a BigInt value.
Description
JSON.stringify[] converts a value to JSON notation representing it:
- If the value has a toJSON[] method, it's responsible to define what data will be serialized.
- Boolean, Number, and String objects are converted to the corresponding primitive values during stringification, in accord with the traditional conversion semantics.
- undefined, Functions, and Symbols are not valid JSON values. If any such values are encountered during conversion they are either omitted [when found in an object] or changed to null [when found in an array]. JSON.stringify[] can return undefined when passing in "pure" values like JSON.stringify[function[]{}] or JSON.stringify[undefined].
- All Symbol-keyed properties will be completely ignored, even when using the replacer function.
- The instances of Date implement the toJSON[] function by returning a string [the same as date.toISOString[]]. Thus, they are treated as strings.
- The numbers Infinity and NaN, as well as the value null, are all considered null.
- All the other Object instances [including Map, Set, WeakMap, and WeakSet] will have only their enumerable properties serialized.
Examples
Using JSON.stringify
The replacer parameter
The replacer parameter can be either a function or an array.
As a function, it takes two parameters: the key and the value being stringified. The object in which the key was found is provided as the replacer's this parameter.
Initially, the replacer function is called with an empty string as key representing the object being stringified. It is then called for each property on the object or array being stringified.
It should return the value that should be added to the JSON string, as follows:
- If you return a Number, String, Boolean, or null, the stringified version of that value is used as the property's value.
- If you return a Function, Symbol, or undefined, the property is not included in the output.
- If you return any other object, the object is recursively stringified, calling the replacer function on each property.
Note: You cannot use the replacer function to remove values from an array. If you return undefined or a function then null is used instead.
Note: If you wish the replacer to distinguish an initial object from a key with an empty string property [since both would give the empty string as key and potentially an object as value], you will have to keep track of the iteration count [if it is beyond the first iteration, it is a genuine empty string key].
Example replacer, as a function
Example replacer, as an array
If replacer is an array, the array's values indicate the names of the properties in the object that should be included in the resulting JSON string.
The space argument
The space argument may be used to control spacing in the final string.
- If it is a number, successive levels in the stringification will each be indented by this many space characters [up to 10].
- If it is a string, successive levels will be indented by this string [or the first ten characters of it].
Using a tab character mimics standard pretty-print appearance:
toJSON[] behavior
If an object being stringified has a property named toJSON whose value is a function, then the toJSON[] method customizes JSON stringification behavior: instead of the object being serialized, the value returned by the toJSON[] method when called will be serialized. JSON.stringify[] calls toJSON with one parameter:
- if this object is a property value, the property name
- if it is in an array, the index in the array, as a string
- an empty string if JSON.stringify[] was directly called on this object
For example:
Issue with JSON.stringify[] when serializing circular references
Note that since the JSON format doesn't support object references [although an IETF draft exists], a TypeError will be thrown if one attempts to encode an object with circular references.
To serialize circular references you can use a library that supports them [e.g. cycle.js by Douglas Crockford] or implement a solution by yourself, which will require finding and replacing [or removing] the cyclic references by serializable values.
Issue with plain JSON.stringify for use as JavaScript
Historically, JSON was not a completely strict subset of JavaScript. The literal code points U+2028 LINE SEPARATOR and U+2029 PARAGRAPH SEPARATOR could appear literally in string literals and property names in JSON text. But they could not appear literally in similar context in JavaScript text, only using Unicode escapes as \u2028 and \u2029. This recently changed: now both code points may appear literally in strings in JSON and JavaScript both.
Therefore, if compatibility with older JavaScript engines is required, it is perilous to directly substitute the string returned by JSON.stringify into a JavaScript string to be passed to eval or new Function or as part of a JSONP URL, and the following utility can be used:
Note: Properties of non-array objects are not guaranteed to be stringified in any particular order. Do not rely on ordering of properties within the same object within the stringification.
Example of using JSON.stringify[] with localStorage
In a case where you want to store an object created by your user and allowing it to be restored even after the browser has been closed, the following example is a model for the applicability of JSON.stringify[]:
Well-formed JSON.stringify[]
Engines implementing the well-formed JSON.stringify specification will stringify lone surrogates, any code point from U+D800 to U+DFFF, using Unicode escape sequences rather than literally. Before this change JSON.stringify would output lone surrogates if the input contained any lone surrogates; such strings could not be encoded in valid UTF-8 or UTF-16:
But with this change JSON.stringify represents lone surrogates using JSON escape sequences that can be encoded in valid UTF-8 or UTF-16:
This change should be backwards-compatible as long as you pass the result of JSON.stringify to APIs such as JSON.parse that will accept any valid JSON text, because they will treat Unicode escapes of lone surrogates as identical to the lone surrogates themselves. Only if you are directly interpreting the result of JSON.stringify do you need to carefully handle JSON.stringify's two possible encodings of these code points.
Specifications
ECMAScript Language Specification [ECMAScript] # sec-json.stringify |
Browser compatibility
BCD tables only load in the browser
See also
- A polyfill of modern JSON.stringify behavior [symbol and well-formed unicode] is available in core-js
- JSON.parse[]