1

我想在 json 中序列化一个非关联数组,输出非常令人不安

JSON.stringify([1]);
// Expected : "[1]"
Output : "\"[1]\""

它将数组视为字符串,我错过了什么?

我正在使用 Chrome 版本 29.0.1547.65

4

1 回答 1

3

您看到的问题是因为 Array.prototype.toJSON 方法在 JSON.stringify 的语义方面定义不正确。见下文:

来自:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

toJSON 行为

如果被字符串化的对象有一个名为 toJSON 的属性,其值为一个函数,那么 toJSON 方法会自定义 JSON 字符串化行为:而不是被序列化的对象,调用时 toJSON 方法返回的值将被序列化。

当一个对象有一个 toJSON 方法时,该方法的结果将被字符串化。如果 toJSON 方法被定义为字符串化,那么对象将被双重字符串化。

我知道的唯一解决方法是删除该方法或实现您自己的 stringify() 方法,其语义与内置方法不同。

如果可以,只需从 Array.prototype 中删除该方法即可。如果您担心这会破坏页面上的其他功能,那么您需要将其删除、字符串化,然后恢复它。

function myStringify( o ) {
    var temp = Array.prototype.toJSON;
    delete Array.prototype.toJSON;
    var result = JSON.stringify(o);
    Array.prototype.toJSON = temp;

    return result;
}
于 2013-10-24T17:08:51.387 回答