簡體   English   中英

為什么JSON.stringify會忽略其值未定義的鍵?

[英]Why does JSON.stringify ignore keys whose values are undefined?

為了更准確,我理解為什么這在技術上發生 - 因為undefined不是有效的JSON類型:

var breakfast = {
    "cereal" : "fruit loops",
    "pastry" : undefined
};

console.log(breakfast);
// -> { cereal: 'fruit loops', pastry: undefined }

console.log(JSON.stringify(breakfast));
// -> {"cereal":"fruit loops"}

我的問題是 - 為什么這被認為是可接受的行為? 有明顯正當理由的原因,我想將undefined作為API的一部分或其他任何東西傳遞。 這似乎有些危險 - 為什么函數不會引發錯誤而不是肆無忌憚地在沒有警告的情況下更改我的數據? 這似乎是JS的一個運行線程。

答案就在於ECMA-262規范 在第24.3.2 JSON.stringify ( value [ , replacer [ , space ] ] )24.3.2 JSON.stringify ( value [ , replacer [ , space ] ] ) ,規范明確指出:

筆記2

未呈現未定義的值。

進一步:

注5

沒有JSON表示的值(例如未定義和函數)不會生成String。 相反,它們會產生未定義的值。 在數組中,這些值表示為String null 在對象中,不可表示的值會導致屬性從字符串化中排除。

因此,正如您使用JSON.stringify()完全遵循現有的ECMA規范。

即使使用替換程序,而沒有專門指定自己的函數,默認的替換程序規則也規定只應追加項目

24.3.2第4.b.5.g小節

如果item 未定義item當前不是PropertyList的元素

JSON意味着與語言無關。 它已經支持null 支持undefined也會強制處理JavaScript對其他語言的特性之一,這違背了易於互操作的目的。

“JSON的設計目標是最小化,可移植,文本和JavaScript的子集。”

至於不拋錯誤,好吧

var x = { foo: undefined };
x.foo === undefined; // true
var json = JSON.stringify(x);
var y = JSON.parse(json);
y.foo === undefined; // true

所以JSON.stringify 可以創建一個表示值x的字符串。 在這種情況下,拋出錯誤不會有用。 事實上,JSON.stringify忽略所有沒有JSON表示的值,因此忽略函數。 例如,這使得序列化對象數據變得容易。

最后,請記住JSON.stringify將一個replacer函數作為參數,可用於改變字符串化的發生方式。 因此,要使JSON.stringify拋出具有undefined值的現有屬性:

var replacer = function(key, value){
    if(value === undefined){
        throw 'JSON.stringify: bad property: ' + key;
    }
    return value;
};

var x = {foo: undefined};
JSON.stringify(x, replacer);
// uncaught exception: JSON.stringify: bad property: foo

或者替換為null

var replacer = function(key, value){
    if(value === undefined){
        return null;
    }
    return value;
};

var x = {foo: undefined};
JSON.stringify(x, replacer); // '{"foo":null}'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM