Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中使用负零字符串化JSON对象?_Javascript_Json - Fatal编程技术网

如何在JavaScript中使用负零字符串化JSON对象?

如何在JavaScript中使用负零字符串化JSON对象?,javascript,json,Javascript,Json,如何使用JSON.stringify将负零转换为字符串(-0)?看起来JSON.stringify将负零转换为表示正零的字符串。有什么好的解决办法吗 var jsn = { negative: -0 }; isNegative(jsn.negative) ? document.write("negative") : document.write("positive"); var jsonString = JSON.stringify(jsn), anotherJSON = JSO

如何使用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;
}

您可以分别为
JSON.stringify
JSON.parse
编写替换程序和恢复程序函数。替换者可以利用
-0===0
1/0===Infinity
1/-0===-Infinity
识别负零并将其转换为特殊字符串。恢复程序只需将特殊字符串转换回
-0
。是JSFIDLE

守则:

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);

我将负零转换为
“负零”
,但您可以使用任何其他字符串,如
“(-0)”

您可以使用JSON.stringify和替换函数将负零更改为特殊字符串(如前面的回答所述),然后使用全局字符串替换将生成的json字符串中的那些特殊字符串更改回负零。例:

函数json(o){ 返回JSON.stringify(o,(k,v)=> (v==0&&1/v==无穷大)?“-0.0”:v)。替换(/“-0.0”/g,“-0”) }
log(json({'hello':0,'world':-0}))为什么需要区分“负零”和“正零”?从数学上讲,零既不是负的也不是正的。下面是关于这个主题的更多背景。。。stringify不会将负零转换为表示正零的字符串。JSON是一个字符串,结果中会有一个无符号的0。+1。从未遇到过替换器/恢复器功能。很高兴知道。请注意,如果您的对象合法地包含这样一个字符串,这将把事情搞砸。@SLaks-Sure。这就是为什么我称它为“特殊”字符串。它必须是对象从不包含为字符串字段的字符串。它还应该指出它是负零的“占位符”。@kol:如果对象可以包含用户输入,则不存在这样的字符串。相反,你需要一个逃生机制。@SLaks有趣。你能举一个例子来说明这个特殊情况下的转义是什么样子的吗?虽然这段代码可以解决OP的问题,但最好包括一个解释,说明你的代码是如何解决OP的问题的。通过这种方式,未来的访问者可以从您的帖子中学习,并将其应用到自己的代码中。因此,它不是一种编码服务,而是一种知识资源。此外,高质量、完整的答案更有可能被提升。这些特性,以及所有帖子都是独立的要求,是SO作为一个平台的一些优势,使其区别于论坛。您可以编辑以添加其他信息和/或使用源文档补充说明。
Object {plusZero: 0, minusZero: 0} Infinity -Infinity
{"plusZero":0,"minusZero":"NEGATIVE_ZERO"} 
Object {plusZero: 0, minusZero: 0} Infinity -Infinity