Das JSON Objekt enthält Methoden für das Einlesen und Konvertieren der JavaScript Object Notation (JSON) in JavaScript und umgekehrt. Es kann nicht aufgerufen oder erstellt werden. Außer seinen zwei Methoden hat das Objekt keine interessante Funktionalität.
Beschreibung
JavaScript Object Notation
JSON ist eine Syntax für das Serialisieren von Objekten, Arrays, Nummern, Strings, Booleanen und null. JSON basiert auf der JavaScript Syntax, jedoch ist sie leicht unterschiedlich: Manches JavaScript ist kein JSON und manches JSON ist kein JavaScript. Für mehr Informationen Siehe in dem Artikel JSON: The JavaScript subset that isn't (englisch).
| JavaScript Typen | JSON Unterschiede |
|---|---|
| Objekte und Arrays | Namen von Eigenschaften müssen als Strings in Doppelten Anführungszeichen (") geschrieben werden; Angefügte Kommas sind verboten. |
| Zahlen | Führende Nullen sind verboten (JSON.stringify ignoriert diese Nullen, jedoch wirft JSON.parse einen SyntaxError); Nach einem Dezimalpunkt muss mindestens eine Ziffer folgen. |
| Strings |
Nur eine begrenzte Menge von Zeichen muss escapet werden; Einige Kontrollzeichen sind verboten; Die Unicodezeichen Zeilenumbruch (U+2028) und Paragraphenumbruch (U+2029) sind erlaubt; Strings müssen in Doppelten Anführungszeichen (") geschrieben werden. Das folgenden Beispiel zeigt eine Situation in der var code = '"\u2028\u2029"'; JSON.parse(code); // funktioniert eval(code); // Error |
Nachfolgend ist die komplette JSON Syntax zu sehen:
JSON = null
or true or false
or JSONNumber
or JSONString
or JSONObject
or JSONArray
JSONNumber = - PositiveNumber
or PositiveNumber
PositiveNumber = DecimalNumber
or DecimalNumber . Digits
or DecimalNumber . Digits ExponentPart
or DecimalNumber ExponentPart
DecimalNumber = 0
or OneToNine Digits
ExponentPart = e Exponent
or E Exponent
Exponent = Digits
or + Digits
or - Digits
Digits = Digit
or Digits Digit
Digit = 0 through 9
OneToNine = 1 through 9
JSONString = ""
or " StringCharacters "
StringCharacters = StringCharacter
or StringCharacters StringCharacter
StringCharacter = any character
except " or \ or U+0000 through U+001F
or EscapeSequence
EscapeSequence = \" or \/ or \\ or \b or \f or \n or \r or \t
or \u HexDigit HexDigit HexDigit HexDigit
HexDigit = 0 through 9
or A through F
or a through f
JSONObject = { }
or { Members }
Members = JSONString : JSON
or Members , JSONString : JSON
JSONArray = [ ]
or [ ArrayElements ]
ArrayElements = JSON
or ArrayElements , JSON
Unbedeutende Whitespaces können überall eingebaut werden außer in eine JSONNumber (Nummern dürfen keine Whitespaces enthalten) und einen JSONString (In dem wird es als das entsprechende Whitespace interpretiert oder führt zu einem Fehler). Das Tab-Zeichen (U+0009), "carriage return"-Zeichen (U+000D), "line feed"-Zeichen (U+000A) und Leerzeichen (U+0020) sind die einzigen erlaubten Whitespace-Zeichen.
Methoden
JSON.parse()- Liest einen String als JSON ein. Optional werden die Werte und die Eigenschaften Transformiert und zurückgegeben.
JSON.stringify()- Gibt ein JSON-String eines übergebenen Wertes zurück. Optional können nur bestimmte Eigenschaften zum JSON hinzugefügt werden oder Eigenschaften werden Ersetzt. Dieses wird durch eine Benutzerdefinierte Methode durchgeführt.
Polyfill
Das JSON Objekt wird in älteren Browsern nicht unterstützt. Man kann dieses Problem lösen indem der folgende Quelltext an den Anfang eines Skriptes geschrieben wird. Dieses ermöglicht den Einsatz des JSON Objektes auch in Browsern die dieses Objekt nicht nativ unterstützen (z. B. Internet Explorer 6).
Der folgende Algorithmus ist eine Nachbildung des nativen JSON Objektes:
if (!window.JSON) {
window.JSON = {
parse: function(sJSON) { return eval('(' + sJSON + ')'); },
stringify: (function () {
var toString = Object.prototype.toString;
var isArray = Array.isArray || function (a) { return toString.call(a) === '[object Array]'; };
var escMap = {'"': '\\"', '\\': '\\\\', '\b': '\\b', '\f': '\\f', '\n': '\\n', '\r': '\\r', '\t': '\\t'};
var escFunc = function (m) { return escMap[m] || '\\u' + (m.charCodeAt(0) + 0x10000).toString(16).substr(1); };
var escRE = /[\\"\u0000-\u001F\u2028\u2029]/g;
return function stringify(value) {
if (value == null) {
return 'null';
} else if (typeof value === 'number') {
return isFinite(value) ? value.toString() : 'null';
} else if (typeof value === 'boolean') {
return value.toString();
} else if (typeof value === 'object') {
if (typeof value.toJSON === 'function') {
return stringify(value.toJSON());
} else if (isArray(value)) {
var res = '[';
for (var i = 0; i < value.length; i++)
res += (i ? ', ' : '') + stringify(value[i]);
return res + ']';
} else if (toString.call(value) === '[object Object]') {
var tmp = [];
for (var k in value) {
if (value.hasOwnProperty(k))
tmp.push(stringify(k) + ': ' + stringify(value[k]));
}
return '{' + tmp.join(', ') + '}';
}
}
return '"' + value.toString().replace(escRE, escFunc) + '"';
};
})()
};
}
Komplexere bekannte Polyfills für das JSON Objekt sind JSON2 und JSON3.
Spezifikationen
| Spezifikation | Status | Kommentar |
|---|---|---|
| ECMAScript 5.1 (ECMA-262) Die Definition von 'JSON' in dieser Spezifikation. |
Standard | Initiale Definition. |
| ECMAScript 2015 (6th Edition, ECMA-262) Die Definition von 'JSON' in dieser Spezifikation. |
Standard | |
| ECMAScript 2017 Draft (ECMA-262) Die Definition von 'JSON' in dieser Spezifikation. |
Entwurf |
Browserkompatibilität
| Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|
| Basic support | (Ja) | 3.5 (1.9.1) | 8.0 | 10.5 | 4.0 |
| Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
|---|---|---|---|---|---|---|
| Basic support | (Ja) | (Ja) | 1.0 (1.0) | (Ja) | (Ja) | (Ja) |