UNPKG

jsan

Version:

handle circular references when stringifying and parsing

53 lines (47 loc) 1.27 kB
var cycle = require('./cycle'); exports.stringify = function stringify(value, replacer, space, _options) { if (arguments.length < 4) { try { if (arguments.length === 1) { return JSON.stringify(value); } else { return JSON.stringify.apply(JSON, arguments); } } catch (e) {} } var options = _options || false; if (typeof options === 'boolean') { options = { 'date': options, 'function': options, 'regex': options, 'undefined': options, 'error': options, 'symbol': options, 'map': options, 'set': options, 'nan': options, 'infinity': options } } var decycled = cycle.decycle(value, options, replacer); if (arguments.length === 1) { return JSON.stringify(decycled); } else { // decycle already handles when replacer is a function. return JSON.stringify(decycled, Array.isArray(replacer) ? replacer : null, space); } } exports.parse = function parse(text, reviver) { var needsRetrocycle = /"\$jsan"/.test(text); var parsed; if (arguments.length === 1) { parsed = JSON.parse(text); } else { parsed = JSON.parse(text, reviver); } if (needsRetrocycle) { parsed = cycle.retrocycle(parsed); } return parsed; }