1

json で非連想配列をシリアライズしたいのですが、出力がかなり邪魔です

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

配列を文字列として扱いますが、何が欠けていますか?

Chrome バージョン 29.0.1547.65 を使用しています

4

1 に答える 1

3

表示されている問題は、JSON.stringify のセマンティクスに関して正しく定義されていない Array.prototype.toJSON メソッドが原因です。下記参照:

出典: 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 に答える