在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结构的约定将有助于规范化所述服务的消耗和重用。至于建立标准,我建议采用大多数杰克逊公约,但有一些例外:
如果要返回一个主要为空值的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>
答案 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 == "")
,但无法测试null
或undefined
。
JSON5 {"myString": "null"}
这可能会让您遇到麻烦,因为您将 string 值设置为null;在这种情况下,obj.myString == "null"
但不是 == null
。
JSON6 {"myArray": []}
这会告诉您阵列myArray
存在,但它是空的。如果您尝试对myArray
执行计数或评估,这非常有用。例如,假设您要评估用户发布的照片数量 - 您可以执行myArray.length
并返回0
:已定义,但未发布照片。
答案 1 :(得分:183)
null
不是零。它不是一个值本身:它是变量域之外的值,表示缺失或未知数据。
只有一种方法可以在JSON中表示null
。根据规格(RFC 4627和json.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
答案 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