在JSON中表示null

时间:2014-01-14 18:19:47

标签: json jackson gson

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

例如,如果服务器上的对象有一个名为“myCount”且没有值的Integer,那么该值的最正确的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结构的约定将有助于规范化所述服务的消耗和重用。至于建立标准,我建议采用大多数杰克逊公约,但有一些例外:

  • 对象优先于原语。
  • 空集合优先于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>

7 个答案:

答案 0 :(得分:277)

让我们评估每个解析:

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; dr 此处:

     

json2 变量中的片段是the JSON spec表示应表示null的方式。但与往常一样,这取决于你正在做什么 - 有时候“正确”的做法并不总是适合你的情况。用你的判断做出明智的决定。


JSON1 {}

返回一个空对象。那里没有数据,它只会告诉你,无论你要找的是什么键(myCount或其他什么),都是undefined类型的。


JSON2 {"myCount": null}

在这种情况下,实际定义了myCount,尽管其值为null。这与“not undefined而不是null”相同,如果您正在测试一个条件或另一个条件,这可能会成功,而JSON1会失败。

这是每the JSON spec代表null的明确方式。


JSON3 {"myCount": 0}

在这种情况下,myCount为0.这与null不同,并且与false不同。如果您的条件语句评估myCount > 0,那么这可能是值得的。此外,如果您根据此处的值运行计算,则0可能很有用。但是,如果您正在尝试测试null,那么这实际上根本不起作用。


JSON4 {"myString": ""}

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


JSON5 {"myString": "null"}

这可能会让您遇到麻烦,因为您将 string 值设置为null;在这种情况下,obj.myString == "null"不是 == null


JSON6 {"myArray": []}

这会告诉您阵列myArray存在,但它是空的。如果您尝试对myArray执行计数或评估,这非常有用。例如,假设您要评估用户发布的照片​​数量 - 您可以执行myArray.length并返回0:已定义,但未发布照片。

答案 1 :(得分:183)

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

只有一种方法可以在JSON中表示null。根据规格(RFC 4627json.org):

2.1.  Values

A JSON value MUST be an object, array, number, or string, or one of
the following three literal names:

  false null true

enter image description here

答案 2 :(得分:19)

只有一种方式来表示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": [] }

答案 3 :(得分:14)

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

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

除非默认有意义,否则我会避免违约。虽然您可能决定使用null来表示没有价值,但肯定不会使用"null"这样做。

答案 4 :(得分:7)

我会为变量的数据类型选择“default”(字符串/对象为null,数字为0),但确实会检查将使用该对象所需的代码。不要忘记,null /默认与“不存在”之间有时会有区别。

结帐null object pattern - 有时最好传递一些特殊对象而不是null(即[]数组而不是null数组或""对于字符串)。

答案 5 :(得分:2)

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

count的情况下,您可能总是想要一些有效数字(除非count未知或未定义),但在字符串的情况下,谁知道?空字符串可以表示应用程序中的某些内容。或者它可能没有。这取决于你决定。

答案 6 :(得分:0)

根据JSON spec,最外面的容器不必是上面大多数注释中所隐含的字典(或“对象”)。它也可以是列表或空值(即字符串,数字,布尔值或null)。如果要在JSON中表示空值,则整个JSON字符串(不包括包含JSON字符串的引号)就是null。没有括号,没有括号,没有引号。您可以指定一个字典,该字典包含一个具有空值的键({"key1":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
相关问题