7

JSON.stringify を使用して負のゼロを文字列 (-0) に変換するにはどうすればよいですか? JSON.stringify は負のゼロを正のゼロを表す文字列に変換するようです。素敵な回避策のアイデアはありますか?

var jsn = {
    negative: -0
};
isNegative(jsn.negative) ? document.write("negative") : document.write("positive");
var jsonString = JSON.stringify(jsn),
    anotherJSON = JSON.parse(jsonString);
isNegative(anotherJSON.negative) ? document.write("negative") : document.write("positive");

function isNegative(a)
{
    if (0 !== a)
    {
        return !1;
    }
    var b = Object.freeze(
    {
        z: -0
    });
    try
    {
        Object.defineProperty(b, "z",
        {
            value: a
        });
    }
    catch (c)
    {
        return !1;
    }
    return !0;
}
4

2 に答える 2

5

JSON.stringifyそれぞれ forとの replacer 関数と reviver 関数を書くことができますJSON.parse。置き換えは、それを利用して-0 === 0、負のゼロを識別し、それらを特別な文字列に変換できます。リバイバーは、特別な文字列を単純に変換して元に戻す必要があります。これがjsfiddleです。1 / 0 === Infinity1 / -0 === -Infinity-0

コード:

function negZeroReplacer(key, value) {
    if (value === 0 && 1 / value < 0) 
        return "NEGATIVE_ZERO";
    return value;
}

function negZeroReviver(key, value) {
    if (value === "NEGATIVE_ZERO")
        return -0;
    return value;
}

var a = { 
        plusZero: 0, 
        minusZero: -0
    },
    s = JSON.stringify(a, negZeroReplacer),
    b = JSON.parse(s, negZeroReviver);

console.clear();
console.log(a, 1 / a.plusZero, 1 / a.minusZero)
console.log(s);
console.log(b, 1 / b.plusZero, 1 / b.minusZero);

出力:

Object {plusZero: 0, minusZero: 0} Infinity -Infinity
{"plusZero":0,"minusZero":"NEGATIVE_ZERO"} 
Object {plusZero: 0, minusZero: 0} Infinity -Infinity

負のゼロを に変換しまし"NEGATIVE_ZERO"たが、 のような他の文字列を使用できます"(-0)"

于 2013-10-24T21:56:31.577 に答える
0

JSON.stringify を replacer 関数とともに使用して、負のゼロを特殊文字列に変更し (前の回答で述べたように)、グローバル文字列置換を使用して、結果の json 文字列でこれらの特殊文字列を負のゼロに戻すことができます。元:

function json(o){
 return JSON.stringify(o,(k,v)=>
  (v==0&&1/v==-Infinity)?"-0.0":v).replace(/"-0.0"/g,'-0')
}

console.log(json({'hello':0,'world':-0}))

于 2020-06-14T14:26:58.123 に答える