stringify.js revision 4612c07daf3859e6ebfc408dc0ef9aed5f97f166
/**
* Provides Y.JSON.stringify method for converting objects to JSON strings.
*
* @module json
* @submodule json-stringify
* @for JSON
* @static
*/
UNDEFINED = 'undefined',
OBJECT = 'object',
NULL = 'null',
STRING = 'string',
NUMBER = 'number',
BOOLEAN = 'boolean',
DATE = 'date',
_allowable= {
'undefined' : UNDEFINED,
'string' : STRING,
'[object String]' : STRING,
'number' : NUMBER,
'[object Number]' : NUMBER,
'boolean' : BOOLEAN,
'[object Boolean]' : BOOLEAN,
'[object Date]' : DATE,
'[object RegExp]' : OBJECT
},
EMPTY = '',
OPEN_O = '{',
CLOSE_O = '}',
OPEN_A = '[',
CLOSE_A = ']',
COMMA = ',',
COMMA_CR = ",\n",
CR = "\n",
COLON = ':',
COLON_SP = ': ',
QUOTE = '"',
// Regex used to capture characters that need escaping before enclosing
// their containing string in quotes.
_SPECIAL = /[\x00-\x07\x0b\x0e-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
// Character substitution map for common escapes and special characters.
_COMMON = [
[/\\/g, '\\\\'],
[/\"/g, '\\"'],
[/\x08/g, '\\b'],
[/\x09/g, '\\t'],
[/\x0a/g, '\\n'],
[/\x0c/g, '\\f'],
[/\x0d/g, '\\r']
],
_COMMON_LENGTH,
// In-process optimization for special character escapes that haven't yet
// been promoted to _COMMON
_CHAR = {},
// Per-char counter to determine if it's worth fast tracking a special
// character escape sequence.
// Utility function used to determine how to serialize a variable.
function _type(o) {
var t = typeof o;
return _allowable[t] || // number, string, boolean, undefined
(t === OBJECT ?
UNDEFINED); // function, unknown
}
// Escapes a special character to a safe Unicode representation
function _char(c) {
if (!_CHAR[c]) {
_CHAR_COUNT[c] = 0;
}
// === to avoid this conditional for the remainder of the current operation
if (++_CHAR_COUNT[c] === _CACHE_THRESHOLD) {
}
return _CHAR[c];
}
// Enclose escaped strings in quotes
function _string(s) {
var i, chr;
// Preprocess the string against common characters to avoid function
// overhead associated with replacement via function.
for (i = 0; i < _COMMON_LENGTH; i++) {
}
// original function replace for the not-as-common set of chars
}
// Adds the provided space to the beginning of every line in the input string
}
// JavaScript implementation of stringify (see API declaration of stringify)
function _stringify(o,w,space) {
if (o === undefined) {
return undefined;
}
var replacer = isFunction(w) ? w : null,
stack = [],
_CHAR_COUNT = {};
w = undefined;
}
// Ensure whitelist keys are unique (bug 2110391)
if (w) {
tmp = {};
tmp[w[i]] = true;
}
w = tmp;
}
// Per the spec, strings are truncated to 10 characters and numbers
// are converted to that number of spaces (max 10)
function _serialize(h,key) {
a = [],
// Per the ECMA 5 spec, toJSON is applied before the replacer is
// called. Also per the spec, Date.prototype.toJSON has been added, so
// Date instances should be serialized prior to exposure to the
// replacer. I disagree with this decision, but the spec is the spec.
} else if (t === DATE) {
}
if (isFunction(replacer)) {
}
}
switch (t) {
case DATE : // intentional fallthrough. Pre-replacer Dates are
// serialized in the toJSON stage. Dates here would
// have been produced by the replacer.
case OBJECT : break;
default : return undefined;
}
// Check for cyclical references in nested objects
throw new Error("JSON.stringify. Cyclical reference");
}
}
// Add the object to the processing stack
if (arr) { // Array
}
} else { // Object
// If whitelist provided, take only those keys
i = 0;
for (k in keys) {
if (keys.hasOwnProperty(k)) {
v = _serialize(value, k);
if (v) {
}
}
}
}
// remove the array from the stack
return arr ?
} else {
return arr ?
}
}
// process the input
}
// Double check basic native functionality. This is primarily to catch broken
// early JSON API implementations in Firefox 3.1 beta1 and beta2.
if ( Native ) {
try {
} catch ( e ) {
useNative = false;
}
}
/**
* Leverage native JSON stringify if the browser has a native
* implementation. In general, this is a good idea. See the Known Issues
* section in the JSON user guide for caveats. The default value is true
* for browsers with native JSON support.
*
* @property JSON.useNativeStringify
* @type Boolean
* @default true
* @static
*/
/**
* Serializes a Date instance as a UTC date string. Used internally by
* stringify. Override this method if you need Dates serialized in a
* different format.
*
* @method dateToString
* @param d {Date} The Date to serialize
* @return {String} stringified Date in UTC format YYYY-MM-DDTHH:mm:SSZ
* @deprecated Use a replacer function
* @static
*/
dateToString : function (d) {
function _zeroPad(v) {
return v < 10 ? '0' + v : v;
}
return d.getUTCFullYear() + '-' +
},
/**
* <p>Converts an arbitrary value to a JSON string representation.</p>
*
* <p>Objects with cyclical references will trigger an exception.</p>
*
* <p>If a whitelist is provided, only matching object keys will be
* included. Alternately, a replacer function may be passed as the
* second parameter. This function is executed on every value in the
* input, and its return value will be used in place of the original value.
* This is useful to serialize specialized objects or class instances.</p>
*
* <p>If a positive integer or non-empty string is passed as the third
* parameter, the output will be formatted with carriage returns and
* indentation for readability. If a String is passed (such as "\t") it
* will be used once for each indentation level. If a number is passed,
* that number of spaces will be used.</p>
*
* @method stringify
* @param o {MIXED} any arbitrary value to convert to JSON string
* @param w {Array|Function} (optional) whitelist of acceptable object
* keys to include, or a replacer function to modify the
* raw value before serialization
* @param ind {Number|String} (optional) indentation character or depth of
* spaces to format the output.
* @return {string} JSON string representation of the input
* @static
*/
},
/**
* <p>Number of occurrences of a special character within a single call to
* stringify that should trigger promotion of that character to a dedicated
* preprocess step for future calls. This is only used in environments
* that don't support native JSON, or when useNativeStringify is set to
* false.</p>
*
* <p>So, if set to 50 and an object is passed to stringify that includes
* strings containing the special character \x07 more than 50 times,
* subsequent calls to stringify will process object strings through a
* faster serialization path for \x07 before using the generic, slower,
* replacement process for all special characters.</p>
*
* <p>To prime the preprocessor cache, set this value to 1, then call
* <code>Y.JSON.stringify("<em>(all special characters to
* cache)</em>");</code>, then return this setting to a more conservative
* value.</p>
*
* <p>Special characters \ " \b \t \n \f \r are already cached.</p>
*
* @property JSON.charCacheThreshold
* @static
* @default 100
* @type {Number}
*/
charCacheThreshold: 100
});