1

给定这样的 JSON:

[
{ "id":"A", "status": 1, "rank":1, "score":  },
{ "id":"B", "status": 1, "rank":1, "score":  }
]

由于分数为空,我的脚本失败。

给定一个这样的 JS:

if (json[i].score) { do something } else { calculate it } 

我想将该字段保持为,而不是使用 0。我可以使用"score": "",但这意味着它是一个字符串(开始时为空),而我希望 score 是一个数字(开始时为空)。所以我输入的数字是一个数字,而不是一个字符串。

如何声明一个空/未定义的数字?


注意:我直觉地认为这就是我有时会遇到的原因undefined


编辑:对问题进行了编辑以澄清上下文,需要检查 obj.score 的存在,其中 0 会产生误导。

4

3 回答 3

5

TL;DR0 :如果每个人都以零分开始,则使用(零)。如果null您特别想说某人的分数尚未设置,请使用 。不要定义属性,如果它不应该放在特定的情况下(比如甚至不应该有"score"属性的对象)。

省略 JSON 对象中的值

好吧,在 JSON 中,您不能只省略该值。它必须设置为数字(整数或浮点数)、对象、列表、布尔值、空值或字符串。要阅读有关语法的更多信息,请尝试以下资源:http: //json.org/。这是取自该站点的图表,向您展示了 JSON 中对象表示的语法:

在此处输入图像描述

最流行的方法:null0(零),未定义

通常的做法是设置null. 在其他情况下,如果适用,最好使用0(零)(例如,该字段表示“总和”)。

另一种方法是不设置属性。反序列化后,您可以执行测试检查特定属性的存在,如下所示:

  • JavaScript:

    if (typeof my_object.score !== 'undefined'){
        // "score" key exists in the object
    }
    
  • Python:

    if 'score' in my_object:
        pass  # "score" key exists in the object
    
  • PHP:

    if (array_key_exists('score', $my_object)) {
        // "score" key exists in the object
    }
    

不太一致的方法:false""

有些人也接受false这种情况下的价值,但这是相当不一致的。同样,当涉及到空字符串 ( "") 时。但是,在反序列化期间,大多数编程语言都应该正确支持这两种情况。

于 2013-07-12T00:55:34.980 回答
1

为什么不直接从 0 开始得分?在任何涉及分数的事情中,每个人都会从 0 分开始。

[
  { "id":"A", "status": 1, "rank":1, "score": 0 },
  { "id":"B", "status": 1, "rank":1, "score": 0 }
]
于 2013-07-12T00:48:25.827 回答
1

根据定义,数字值是一个值类型,它不能是null。只有引用类型(如字符串、数组等)应初始化为null.

对于您的情况的语义,我建议您使用布尔值来了解是否有要读取的分数。

[
    { "id":"A", "status": 1, "rank":1, "empty":true  },
    { "id":"B", "status": 1, "rank":1, "empty":false, "score":100}
]

然后,

if (!foo.empty) {
    var score = foo.score;
}

虽然 anull也可以测试,但它是数字的错误表示。

于 2013-07-12T00:51:59.210 回答