[6a3a178] | 1 | # 🚨 Unmaintained 🚨
|
---|
| 2 |
|
---|
| 3 | <p class="banner">JSON 3 is **deprecated** and **no longer maintained**. Please don't use it in new projects, and migrate existing projects to use the native `JSON.parse` and `JSON.stringify` instead.</p>
|
---|
| 4 |
|
---|
| 5 | Thanks to everyone who contributed patches or found it useful! ❤️
|
---|
| 6 |
|
---|
| 7 | # JSON 3 #
|
---|
| 8 |
|
---|
| 9 | [![No Maintenance Intended](http://unmaintained.tech/badge.svg)](http://unmaintained.tech/)
|
---|
| 10 |
|
---|
| 11 | **JSON 3** was a JSON polyfill for older JavaScript platforms.
|
---|
| 12 |
|
---|
| 13 | ## About ##
|
---|
| 14 |
|
---|
| 15 | [JSON](http://json.org/) is a language-independent data interchange format based on a loose subset of the JavaScript grammar. Originally popularized by [Douglas Crockford](http://www.crockford.com/), the format was standardized in the [fifth edition](http://es5.github.io/) of the ECMAScript specification. The 5.1 edition, ratified in June 2011, incorporates several modifications to the grammar pertaining to the serialization of dates.
|
---|
| 16 |
|
---|
| 17 | JSON 3 exposes two functions: `stringify()` for [serializing](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/stringify) a JavaScript value to JSON, and `parse()` for [producing](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/parse) a JavaScript value from a JSON source string. The JSON 3 parser uses recursive descent instead of `eval` and regular expressions, which makes it slower on older platforms compared to [JSON 2](http://json.org/js). The functions behave exactly as described in the ECMAScript spec, **except** for the date serialization discrepancy noted below.
|
---|
| 18 |
|
---|
| 19 | The project is [hosted on GitHub](http://git.io/json3), along with the [unit tests](http://bestiejs.github.io/json3/test/test_browser.html). It is part of the [BestieJS](https://github.com/bestiejs) family, a collection of best-in-class JavaScript libraries that promote cross-platform support, specification precedents, unit testing, and plenty of documentation.
|
---|
| 20 |
|
---|
| 21 | ## Date Serialization
|
---|
| 22 |
|
---|
| 23 | **JSON 3 deviates from the specification in one important way**: it does not define `Date#toISOString()` or `Date#toJSON()`. This preserves CommonJS compatibility and avoids polluting native prototypes. Instead, date serialization is performed internally by the `stringify()` implementation: if a date object does not define a custom `toJSON()` method, it is serialized as a [simplified ISO 8601 date-time string](http://es5.github.com/#x15.9.1.15).
|
---|
| 24 |
|
---|
| 25 | **Several native `Date#toJSON()` implementations produce date time strings that do *not* conform to the grammar outlined in the spec**. In these environments, JSON 3 will override the native `stringify()` implementation. There is an [issue](https://github.com/bestiejs/json3/issues/73) on file to make these tests less strict.
|
---|
| 26 |
|
---|
| 27 | Portions of the date serialization code are adapted from the [`date-shim`](https://github.com/Yaffle/date-shim) project.
|
---|
| 28 |
|
---|
| 29 | # Usage #
|
---|
| 30 |
|
---|
| 31 | ## Web Browsers
|
---|
| 32 |
|
---|
| 33 | <script src="//cdnjs.cloudflare.com/ajax/libs/json3/3.3.2/json3.min.js"></script>
|
---|
| 34 | <script>
|
---|
| 35 | JSON.stringify({"Hello": 123});
|
---|
| 36 | // => '{"Hello":123}'
|
---|
| 37 | JSON.parse("[[1, 2, 3], 1, 2, 3, 4]", function (key, value) {
|
---|
| 38 | if (typeof value == "number") {
|
---|
| 39 | value = value % 2 ? "Odd" : "Even";
|
---|
| 40 | }
|
---|
| 41 | return value;
|
---|
| 42 | });
|
---|
| 43 | // => [["Odd", "Even", "Odd"], "Odd", "Even", "Odd", "Even"]
|
---|
| 44 | </script>
|
---|
| 45 |
|
---|
| 46 | **When used in a web browser**, JSON 3 exposes an additional `JSON3` object containing the `noConflict()` and `runInContext()` functions, as well as aliases to the `stringify()` and `parse()` functions.
|
---|
| 47 |
|
---|
| 48 | ### `noConflict` and `runInContext`
|
---|
| 49 |
|
---|
| 50 | * `JSON3.noConflict()` restores the original value of the global `JSON` object and returns a reference to the `JSON3` object.
|
---|
| 51 | * `JSON3.runInContext([context, exports])` initializes JSON 3 using the given `context` object (e.g., `window`, `global`, etc.), or the global object if omitted. If an `exports` object is specified, the `stringify()`, `parse()`, and `runInContext()` functions will be attached to it instead of a new object.
|
---|
| 52 |
|
---|
| 53 | ### Asynchronous Module Loaders
|
---|
| 54 |
|
---|
| 55 | JSON 3 is defined as an [anonymous module](https://github.com/amdjs/amdjs-api/wiki/AMD#define-function-) for compatibility with [RequireJS](http://requirejs.org/), [`curl.js`](https://github.com/cujojs/curl), and other asynchronous module loaders.
|
---|
| 56 |
|
---|
| 57 | <script src="//cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.js"></script>
|
---|
| 58 | <script>
|
---|
| 59 | require({
|
---|
| 60 | "paths": {
|
---|
| 61 | "json3": "./path/to/json3"
|
---|
| 62 | }
|
---|
| 63 | }, ["json3"], function (JSON) {
|
---|
| 64 | JSON.parse("[1, 2, 3]");
|
---|
| 65 | // => [1, 2, 3]
|
---|
| 66 | });
|
---|
| 67 | </script>
|
---|
| 68 |
|
---|
| 69 | To avoid issues with third-party scripts, **JSON 3 is exported to the global scope even when used with a module loader**. If this behavior is undesired, `JSON3.noConflict()` can be used to restore the global `JSON` object to its original value.
|
---|
| 70 |
|
---|
| 71 | **Note:** If you intend to use JSON3 alongside another module, **please do not simply concatenate these modules together**, as that would cause multiple `define` calls in one script, resulting in errors in AMD loaders. The `r.js` build optimizer can be used instead if you need a single compressed file for production.
|
---|
| 72 |
|
---|
| 73 | ## CommonJS Environments
|
---|
| 74 |
|
---|
| 75 | var JSON3 = require("./path/to/json3");
|
---|
| 76 | JSON3.parse("[1, 2, 3]");
|
---|
| 77 | // => [1, 2, 3]
|
---|
| 78 |
|
---|
| 79 | ## JavaScript Engines
|
---|
| 80 |
|
---|
| 81 | load("path/to/json3.js");
|
---|
| 82 | JSON.stringify({"Hello": 123, "Good-bye": 456}, ["Hello"], "\t");
|
---|
| 83 | // => '{\n\t"Hello": 123\n}'
|
---|
| 84 |
|
---|
| 85 | # Compatibility #
|
---|
| 86 |
|
---|
| 87 | JSON 3 has been **tested** with the following web browsers, CommonJS environments, and JavaScript engines.
|
---|
| 88 |
|
---|
| 89 | ## Web Browsers
|
---|
| 90 |
|
---|
| 91 | - Windows [Internet Explorer](http://windows.microsoft.com/en-us/internet-explorer/download-ie), version 6.0 and higher
|
---|
| 92 | - Google [Chrome](http://www.google.com/chrome), version 19.0 and higher
|
---|
| 93 | - Mozilla [Firefox](https://www.mozilla.org/en-US/firefox/new/), version 2.0 and higher
|
---|
| 94 | - Apple [Safari](http://www.apple.com/safari/), version 3.0 and higher
|
---|
| 95 | - [Opera](http://www.opera.com/) 8.54 and higher
|
---|
| 96 | - [SeaMonkey](http://www.seamonkey-project.org/) 1.0 and higher
|
---|
| 97 |
|
---|
| 98 | ## CommonJS Environments
|
---|
| 99 |
|
---|
| 100 | - [Node](http://nodejs.org/) 0.6.21 and higher
|
---|
| 101 | - [io.js](https://iojs.org/) 1.0.3 and higher
|
---|
| 102 | - [RingoJS](http://ringojs.org/) 0.9 and higher
|
---|
| 103 | - [Narwhal](https://github.com/280north/narwhal) 0.3.2
|
---|
| 104 |
|
---|
| 105 | ## JavaScript Engines
|
---|
| 106 |
|
---|
| 107 | - Mozilla [Rhino](https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Rhino) 1.7R3 and higher
|
---|
| 108 | - WebKit [JSC](https://trac.webkit.org/wiki/JSC)
|
---|
| 109 | - Google [V8](http://code.google.com/p/v8/)
|
---|
| 110 |
|
---|
| 111 | ## Known Incompatibilities
|
---|
| 112 |
|
---|
| 113 | * Attempting to serialize the `arguments` object may produce inconsistent results across environments due to specification version differences. As a workaround, please convert the `arguments` object to an array first: `JSON.stringify([].slice.call(arguments, 0))`.
|
---|
| 114 |
|
---|
| 115 | ## Required Native Methods
|
---|
| 116 |
|
---|
| 117 | JSON 3 assumes that the following methods exist and function as described in the ECMAScript specification:
|
---|
| 118 |
|
---|
| 119 | - The `Number`, `String`, `Array`, `Object`, `Date`, `SyntaxError`, and `TypeError` constructors.
|
---|
| 120 | - `String.fromCharCode`
|
---|
| 121 | - `Object#toString`
|
---|
| 122 | - `Object#hasOwnProperty`
|
---|
| 123 | - `Function#call`
|
---|
| 124 | - `Math.floor`
|
---|
| 125 | - `Number#toString`
|
---|
| 126 | - `Date#valueOf`
|
---|
| 127 | - `String.prototype`: `indexOf`, `charCodeAt`, `charAt`, `slice`, `replace`.
|
---|
| 128 | - `Array.prototype`: `push`, `pop`, `join`.
|
---|