|
|
|
|
|
JSON.stringify()
方法將一個 JavaScript 對象或值轉(zhuǎn)換為 JSON 字符串。在轉(zhuǎn)換過程中,可能你會遇到一些意外問題,比如某些值在轉(zhuǎn)換前后發(fā)生了變化,為此,你需要特別注意,務必查看轉(zhuǎn)換后的字符串是否與自己的期望一致。
本文將提供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()
將值轉(zhuǎn)換為相應的JSON格式,下面是轉(zhuǎn)換時要注意的問題:
1、轉(zhuǎn)換值如果有 toJSON()
方法,該方法定義什么值將被序列化。
2、非數(shù)組對象的屬性不能保證以特定的順序出現(xiàn)在序列化后的字符串中。
3、布爾值、數(shù)字、字符串的包裝對象在序列化過程中會自動轉(zhuǎn)換成對應的原始值。
4、undefined
、任意的函數(shù)以及 symbol
值,在序列化過程中會被忽略(出現(xiàn)在非數(shù)組對象的屬性值中時)或者被轉(zhuǎn)換成 null(出現(xiàn)在數(shù)組中時)。函數(shù)、undefined
被單獨轉(zhuǎn)換時,會返回 undefined
,如JSON.stringify(function(){})
或 JSON.stringify(undefined)
。
5、對包含循環(huán)引用的對象(對象之間相互引用,形成無限循環(huán))執(zhí)行此方法,會拋出錯誤。
6、所有以 symbol
為屬性鍵的屬性都會被完全忽略掉。
7、Date
日期調(diào)用了 toJSON()
將其轉(zhuǎn)換為了 string
字符串(同Date.toISOString()
),因此會被當做字符串處理。
8、NaN 和 Infinity 格式的數(shù)值及 null 都會被當做 null。
9、其他類型的對象,包括 Map/Set/WeakMap/WeakSet,僅會序列化可枚舉的屬性。
toJSON 方法
如果一個被序列化的對象擁有 toJSON
方法,那么該 toJSON
方法就會覆蓋該對象默認的序列化行為:不是該對象被序列化,而是調(diào)用 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()的用法,以及轉(zhuǎn)換時要注意的問題,希望對大家有所幫助。