表示JSON中的null


422

在JSON中返回空值的首选方法是什么?对基元有不同的偏好吗?

例如,如果我在服务器上的对象具有一个名为“ myCount”的无值的整数,则该值的最正确的JSON为:

{}

要么

{
    "myCount": null
}

要么

{
    "myCount": 0
}

字符串的相同问题-如果我在服务器上使用空字符串“ myString”,则是最好的JSON:

{}

要么

{
    "myString": null
}

要么

{
    "myString": ""
}

或(上帝帮我)

{
    "myString": "null"
}

我喜欢将集合以JSON形式表示为空集合的约定http://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html

空数组将被表示:

{
    "myArray": []
}

编辑摘要

“个人偏爱”的论点似乎是现实的,但在短期内,作为一个社区,我们将消耗越来越多的不同服务/资源。JSON结构的约定将有助于规范所述服务的使用和重用。至于建立标准,我建议采用大多数Jackson公约,但有一些例外:

  • 对象优于基元。
  • 空集合优先于null。
  • 没有值的对象表示为null。
  • 基元返回其值。

如果您要返回一个大多数为空值的JSON对象,则可能有一个候选者可以重构为多个服务。

{

    "value1": null,

    "value2": null,

    "text1": null,

    "text2": "hello",

    "intValue": 0, //use primitive only if you are absolutely sure the answer is 0

    "myList": [],

    "myEmptyList": null, //NOT BEST PRACTICE - return [] instead

    "boolean1": null, //use primitive only if you are absolutely sure the answer is true/false

    "littleboolean": false

}

上面的JSON是从以下Java类生成的。

package jackson;

import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonApp {

    public static class Data {

        public Integer value1;

        public Integer value2;

        public String text1;

        public String text2 = "hello";

        public int intValue;

        public List<Object> myList = new ArrayList<Object>();

        public List<Object> myEmptyList;

        public Boolean boolean1;

        public boolean littleboolean;

    }

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        System.out.println(mapper.writeValueAsString(new Data()));
    }
}

Maven的依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.3.0</version>
</dependency>

5
没有最好的办法。在您的具体用例中,选择最容易为客户使用的东西。本着返回空集合而不是的精神null,请考虑使用空字符串还是让客户更好null-包含单词“ null”的字符串与有效值是无法区分的,请不要这样做。
Philipp Reichart

3
0或空字符串很可能与null具有不同的含义,而null与不存在的属性可能具有不同的含义。如果要表示null,请使用null。这是最明确的。
约翰·希恩

在Objective-C中,有一个NSNull具有单例实例的已定义类。对该实例的引用等效于JSON的引用null。我猜想另一种语言可以做同样的事情。当然,在转换为假定的类之前,必须先检查接收到的对象的类-保持“空感知”。
Hot Licks

2
请注意,在Java中,“空”列表也不是最佳实践:如果期望该列表为空,则将其初始化为一个空列表。如果需要保持为空(例如,因为它会通过一个新的列表来代替批发,而不是修改,添加值),INITIALISE它空表(即Collections.emptyList())。这样做避免了空引用错误,否则可能会很痛苦。
Periata Breatta '16

@HotLicks-这是唯一可行的,因为Objective-C是动态键入的。例如,在Java中,您将没有(有用的)Null类,因为您只能将其值分配给其自身类型或type的对象Object
Periata Breatta '16

Answers:


378

让我们评估每个的解析:

http://jsfiddle.net/brandonscript/Y2dGv/

var json1 = '{}';
var json2 = '{"myCount": null}';
var json3 = '{"myCount": 0}';
var json4 = '{"myString": ""}';
var json5 = '{"myString": "null"}';
var json6 = '{"myArray": []}';

console.log(JSON.parse(json1)); // {}
console.log(JSON.parse(json2)); // {myCount: null}
console.log(JSON.parse(json3)); // {myCount: 0}
console.log(JSON.parse(json4)); // {myString: ""}
console.log(JSON.parse(json5)); // {myString: "null"}
console.log(JSON.parse(json6)); // {myArray: []}

TL;博士在这里:

json2变量中的片段是JSON规范所表示的方式null。但是,一如既往,这取决于您的工作-有时,“正确”的方法并不总是适合您的情况。使用您的判断并做出明智的决定。


JSON1 {}

这将返回一个空对象。那里没有数据,只会告诉您您要查找的任何键(无论是键还是其他键myCount)都是type undefined


JSON2 {"myCount": null}

在这种情况下,myCount实际上是定义了,尽管其值为null。这是一样的两个“不undefined,不null”,如果你是一个条件或其他测试,这可能会成功,而JSON1会失败。

这是null按照JSON规范表示的确定方式。


JSON3 {"myCount": 0}

在这种情况下,myCount为0。与null,和并不相同false。如果您的条件语句评估为myCount > 0,那么可能值得拥有。此外,如果您基于此处的值运行计算,则0可能会有用。null但是,如果您要进行测试,那么这实际上是行不通的。


JSON4 {"myString": ""}

在这种情况下,您将得到一个空字符串。同样,与JSON2一样,它已定义,但它为空。您可以测试,if (obj.myString == "")但不能测试nullundefined


JSON5 {"myString": "null"}

这很可能会给您带来麻烦,因为您将字符串值设置为null。在这种情况下,obj.myString == "null"不是 == null


JSON6 {"myArray": []}

这将告诉您您的数组myArray存在,但是它为空。如果您要对进行计数或评估,这将很有用myArray。例如,假设您要评估用户发布的照片​​数量-您可以这样做myArray.length,它将返回0:defined,但没有发布照片。


1
非常感谢,非常有帮助。只是一个小的副节点;当播放JSON(阶)序列化选项[字符串] =无结果是JSON1{}
尼尔

207

null不为零。这不是一个值,本身:它是变量,指示丢失的或未知的数据的域之外的值。

null用JSON 表示的方法只有一种。根据规范(RFC 4627json.org):

2.1。价值观

JSON值必须是对象,数组,数字或字符串,或者是以下之一
以下三个文字名称:

  假null真

在此处输入图片说明


8
太可惜了,根本没有空值。4个字符,什么都没有。完全排除该值会很好。 json = '{"myValue":}';
理查德·阿夸德

119
@理查德四重奏-我是哈尔·阿伯森(Hal Abelson)的追随者,他说:“程序必须为人们阅读而编写,并且只能为机器执行而编写”。我宁愿使用“空”这个词来确认程序员的意图,而不仅仅是偶然遗漏的问题。
Scott Smith

13
@Dave May:“ JSON值不是程序”-我的意思是关于以明确的方式表示意图。是的,它额外花费了四个字符,对于某些应用程序,差异可能很大。但是,在许多情况下,使错误看起来错误的好处远远超过了次要优化的好处。
史密斯史密斯

11
@Dave另外,根据json.org,JSON“对于人类来说很容易读写”。
Sophivorus's

14
另请注意,如果您在使用4个ASCII字符时遇到问题,则JSON并不是最好的方法,请查看Binary JSON或更好的纯二进制格式。
PhoneixS

26

只有一种表示方式null; 那是与null

console.log(null === null);   // true
console.log(null === true);   // false
console.log(null === false);  // false
console.log(null === 'null'); // false
console.log(null === "null"); // false
console.log(null === "");     // false
console.log(null === []);     // false
console.log(null === 0);      // false

也就是说; 如果使用您的JSON表示形式的任何客户端都使用===运算符;对他们来说可能是个问题。

没有价值

如果要表达一个对象,该对象的属性myCount没有值:

{ "myCount": null }

无属性/缺少属性

如果要传达您拥有没有属性的对象怎么办:

{}

客户代码将尝试访问myCount和获取undefined;它不在那里。

空集合

如果要传达您拥有一个属性myCount为空列表的对象该怎么办:

{ "myCount": [] }

+1个具有比较功能的良好示例,但有助于区分javascript和json,这意味着javascript中null的表示不必与json匹配(尽管可以)。
Mladen B.

15

我会null用来表明该特定键没有任何价值。例如,用于null表示“您家庭中连接到互联网的设备数量”未知。

另一方面,{}如果该特定键不适用,请使用。例如,即使null向没有任何汽车的人询问“具有有效互联网连接的汽车数量”问题,您也不应显示计数。

我将避免默认任何值,除非该默认值有意义。尽管您可能决定使用null代表无价值,但绝对不"null"要这样做。


7

我会为变量的数据类型(null对于字符串/对象,0对于数字)选择“默认” ,但实际上检查将消耗对象期望的代码。不要忘记null/ default和“ not present” 之间有时会有区别。

检查空对象模式 -有时最好传递一些特殊对象而不是传递null(即,使用[]数组代替null数组或""字符串)。


2

这是个人和情况选择。要记住的重要一点是,空字符串和数字零在概念上与有所不同null

对于a来说,count您可能总是想要一些有效数字(除非count未知或未定义),但是对于字符串,谁知道呢?空字符串可能意味着您的应用程序中有某些内容。也许不是。由您决定。


1

根据JSON规范,最外面的容器不必是上面大多数注释中所隐含的字典(或“对象”)。它也可以是列表或裸值(即字符串,数字,布尔值或null)。如果要在JSON中表示null值,则整个JSON字符串(不包括包含JSON字符串的引号)都只是null。没有花括号,没有括号,没有引号。您可以指定一个字典,该字典包含一个具有空值的键({"key1":null}),或者一个具有空值的列表([null]),但是它们本身不是空值-它们是适当的字典和列表。同样,一个空的字典({})或一个空的列表([])都很好,但也不是null。

在Python中:

>>> print json.loads('{"key1":null}')
{u'key1': None}
>>> print json.loads('[null]')
[None]
>>> print json.loads('[]')
[]
>>> print json.loads('{}')
{}
>>> print json.loads('null')
None

请注意,链接的JSON规范页面右侧栏上的McKeeman Form语法可验证断言null构成有效JSON 的断言。主体文本和插图含糊不清,如果有什么暗示似乎只有对象和数组在根目录有效。
yoyoyoyosef
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.