Erfahrene Spieler, wissen Sie, dass JSON.stringify auch den zweiten und dritten optionalen Parameter hat? Was sind sie? Fühlt es sich nicht unglaublich an? Der folgende Artikel stellt Ihnen einige verwandte Informationen zu JSON.stringify vor, die Sie möglicherweise nicht kennen. Der Artikel stellt es im Detail anhand von Beispielcode vor.
Vorwort
JSON hat XML nach und nach ersetzt und wird von Entwicklern auf der ganzen Welt häufig verwendet. In diesem Artikel werden einige Details zur Verwendung von JSON.stringify in JavaScript ausführlich erläutert. Zunächst ein kurzer Überblick über JSON und JavaScript:
Nicht jedes legale JSON ist gültiges JavaScript
JSON ist nur ein Textformat
1. JSON.stringify
let foo = { a: 2, b: function() {} }; JSON.stringify(foo); // "{ "a": 2 }"
1. Zirkelverweis
Wenn der Attributwert eines Objekts auf irgendeine indirekte Weise auf das Objekt selbst verweist, handelt es sich um einen Zirkelverweis. Beispiel:var bar = { a: { c: foo } }; var foo = { b: bar };
let fooStringified = JSON.stringify(foo); console.log(fooStringified); // {"b":{"a":{}}}
let foo = {b : foo};
ReferenceError: foo is not defined at repl:1:14
2. Symbol und undefiniert
let foo = { b: undefined }; JSON.stringify(foo); // {} // Symbols foo.b = Symbol(); JSON.stringify(foo); // {}
let foo = [Symbol(), undefined, function() {}, 'works'] JSON.stringify(foo); // "[null,null,null,'works']"
Warum können einige Attribute nicht stringifiziert werden?
Weil JSON ein universelles Textformat ist und nichts mit Sprache zu tun hat. Stellen Sie sich vor, dass es besonders kompliziert wird, zu bestimmen, um welche Sprache es sich handelt, und sie in geeigneter Weise darzustellen, wenn die Funktionsdefinition auch stringifiziert ist. Insbesondere einige sprachbezogene Funktionen, wie z. B. Symbole in JavaScript. ECMASCript-Beamte haben diesen Punkt auch ausdrücklich hervorgehoben: Es wird nicht versucht, die internen Datendarstellungen von ECMAScript anderen Programmiersprachen aufzuzwingen, sondern es wird eine kleine Teilmenge der Textdarstellungen von ECMAScript mit allen anderen Programmiersprachen geteilt Sprachen.2. Schreiben Sie das Objekt in eine JSON-Funktion um
Eine Möglichkeit, die Unfähigkeit zu umgehen, bestimmte Eigenschaften eines Objekts zu stringifizieren, besteht darin, die zu implementieren toJSON-Methode des Objekts zum Anpassen des zu stringifizierenden Objekts. Da fast jeder AJAX-Aufruf JSON.stringify verwendet, wird die Beherrschung dieser Technik eine große Hilfe bei der Handhabung von Serverinteraktionen sein. Ähnlich wie toString, mit dem Sie Elemente in einem Objekt als String zurückgeben können, bietet toJSON eine Methode zum Konvertieren von Attributen im Objekt, die nicht in einen String umgewandelt werden können, in den als nächstes aufgerufenen Stringify JSON-Format.function Person (first, last) { this.firstName = first; this.last = last; } Person.prototype.process = function () { return this.firstName + ' ' + this.lastName; }; let ade = new Person('Ade', 'P'); JSON.stringify(ade); // "{"firstName":"Ade","last":"P"}"
Person.prototype.toJSON = function () { return { fullName: this.process(); }; }; let ade = new Person('Ade', 'P'); JSON.stringify(ade); // "{"fullName":"Ade P"}"
// jQuery $.post('endpoint', ade); // Angular 2 this.httpService.post('endpoint', ade)
3. Optionale Parameter
Die vollständige Definition von JSON.stringify lautet wie folgt :JSON.stringify(value, replacer?, space?)
Replacer
Replacer ist eine Filterfunktion oder ein Array, das die zu stringifizierenden Attributnamen enthält. Wenn nicht definiert, werden alle Eigenschaften standardmäßig mit Zeichenfolgen versehen.1. Array
Nur Attribute im Array werden stringifiziert:let foo = { a : 1, b : "string", c : false }; JSON.stringify(foo, ['a', 'b']); //"{"a":1,"b":"string"}"
let bar = { a : 1, b : { c : 2 } }; JSON.stringify(bar, ['a', 'b']); //"{"a":1,"b":{}}" JSON.stringify(bar, ['a', 'b', 'c']); //"{"a":1,"b":{"c":2}}"
2. Funktion
Die Filterfunktion verwendet jedes Attribut und jeden Wert im Objekt als Eingabe und der Rückgabewert hat die folgenden Situationen:返回无法stringify的值将会被忽略;
let baz = { a : 1, b : { c : 2 } }; // 返回大于1的值 let replacer = function (key, value) { if(typeof === 'number') { return value > 1 ? value: undefined; } return value; }; JSON.stringify(baz, replacer); // "{"b":{"c":2}}"
通过改写上面的函数加入适当的输出,可以看到具体的执行步骤:
let obj = { a : 1, b : { c : 2 } }; let tracer = function (key, value){ console.log('Key: ', key); console.log('Value: ', value); return value; }; JSON.stringify(obj, tracer); // Key: // Value: Object {a: 1, b: Object} // Key: a // Value: 1 // Key: b // Value: Object {c: 2} // Key: c // Value: 2
space
你是否意识到调用默认的JSON.stringify返回的值只要一行,而且完全没有空格?如果想要更加美观的打印出来,那么就需要使用space这个参数了。
我告诉你一个非常简单的方法:通过tab(‘\t')来分割即可。
let space = { a : 1, b : { c : 2 } }; // 使用制表符 JSON.stringify(space, undefined, '\t'); // "{ // "a": 1, // "b": { // "c": 2 // } // }" JSON.stringify(space, undefined, ''); // {"a":1,"b":{"c":2}} // 自定义分隔符 JSON.stringify(space, undefined, 'a'); // "{ // a"a": 1, // a"b": { // aa"c": 2 // a} // }"
一道三颗星的思考题:为什么打印结果的倒数第三行有两个a呢?
结论
本文介绍了一些使用toJSON的技巧:
无法stringify的几种类型
使用toJSON来自定义JSON.stringify的属性
可选参数replacer的两种定义方法来过滤属性
可选参数space用来格式化输出结果
数组和对象中如果包含无法stringify的元素的时候的区别
Das obige ist der detaillierte Inhalt vonEinführung in die Verwendung von JSON.stringify(). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!