|
|
|
|
|
|
JSON.stringify()方法將一個 JavaScript 對象或值轉換為 JSON 字符串。在轉換過程中,可能你會遇到一些意外問題,比如某些值在轉換前后發生了變化,為此,你需要特別注意,務必查看轉換后的字符串是否與自己的期望一致。

本文將提供15個JSON.stringify()示例,介紹JSON.stringify()的用法及注意問題。
在文章開始之前,你還可以參考下文,了解更多有關JSON.stringify()的知識。
使用 JSON.stringify() 方法
JSON.stringify({}); // '{}'
JSON.stringify(true); // 'true'
JSON.stringify("foo"); // '"foo"'
JSON.stringify([1, "false", false]); // '[1,"false",false]'
JSON.stringify({ x: 5 }); // '{"x":5}'
JSON.stringify({x: 5, y: 6});
// "{"x":5,"y":6}"
JSON.stringify([new Number(1), new String("false"), new Boolean(false)]);
// '[1,"false",false]'
JSON.stringify({x: undefined, y: Object, z: Symbol("")});
// '{}'
JSON.stringify([undefined, Object, Symbol("")]);
// '[null,null,null]'
JSON.stringify({[Symbol("foo")]: "foo"});
// '{}'
JSON.stringify({[Symbol.for("foo")]: "foo"}, [Symbol.for("foo")]);
// '{}'
JSON.stringify(
{[Symbol.for("foo")]: "foo"},
function (k, v) {
if (typeof k === "symbol"){
return "a symbol";
}
}
);
// undefined
// 不可枚舉的屬性默認會被忽略:
JSON.stringify(
Object.create(
null,
{
x: { value: 'x', enumerable: false },
y: { value: 'y', enumerable: true }
}
)
);
// "{"y":"y"}"
解釋
JSON.stringify()將值轉換為相應的JSON格式,下面是轉換時要注意的問題:
1、轉換值如果有 toJSON() 方法,該方法定義什么值將被序列化。
2、非數組對象的屬性不能保證以特定的順序出現在序列化后的字符串中。
3、布爾值、數字、字符串的包裝對象在序列化過程中會自動轉換成對應的原始值。
4、undefined、任意的函數以及 symbol 值,在序列化過程中會被忽略(出現在非數組對象的屬性值中時)或者被轉換成 null(出現在數組中時)。函數、undefined 被單獨轉換時,會返回 undefined,如JSON.stringify(function(){}) 或 JSON.stringify(undefined)。
5、對包含循環引用的對象(對象之間相互引用,形成無限循環)執行此方法,會拋出錯誤。
6、所有以 symbol 為屬性鍵的屬性都會被完全忽略掉。
7、Date 日期調用了 toJSON() 將其轉換為了 string 字符串(同Date.toISOString()),因此會被當做字符串處理。
8、NaN 和 Infinity 格式的數值及 null 都會被當做 null。
9、其他類型的對象,包括 Map/Set/WeakMap/WeakSet,僅會序列化可枚舉的屬性。
toJSON 方法
如果一個被序列化的對象擁有 toJSON 方法,那么該 toJSON 方法就會覆蓋該對象默認的序列化行為:不是該對象被序列化,而是調用 toJSON 方法后的返回值會被序列化,例如:
var obj = {
foo: 'foo',
toJSON: function () {
return 'bar';
}
};
JSON.stringify(obj); // '"bar"'
JSON.stringify({x: obj}); // '{"x":"bar"}'JSON.stringify用作 JavaScript
注意 JSON 不是 JavaScript 嚴格意義上的子集,在 JSON 中不需要省略兩條終線(Line separator 和 Paragraph separator),但在 JavaScript 中需要被省略。因此,如果 JSON 被用作 JSONP 時,下面方法可以使用:
function jsFriendlyJSONStringify (s) {
return JSON.stringify(s).
replace(/\u2028/g, '\\u2028').
replace(/\u2029/g, '\\u2029');
}
var s = {
a: String.fromCharCode(0x2028),
b: String.fromCharCode(0x2029)
};
try {
eval('(' + JSON.stringify(s) + ')');
} catch (e) {
console.log(e); // "SyntaxError: unterminated string literal"
}
// No need for a catch
eval('(' + jsFriendlyJSONStringify(s) + ')');
// console.log in Firefox unescapes the Unicode if
// logged to console, so we use alert
alert(jsFriendlyJSONStringify(s)); // {"a":"\u2028","b":"\u2029"}總結
本文通過15個示例,介紹了JSON.stringify()的用法,以及轉換時要注意的問題,希望對大家有所幫助。
