在JSON中表示空值

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

例如,如果服务器上的对象具有一个名为“myCount”的Integer而没有值,则该值最正确的JSON将是:

{} 

要么

 { "myCount": null } 

要么

 { "myCount": 0 } 

同样的问题的string – 如果我有一个空string“myString”在服务器上,是最好的JSON:

 {} 

要么

 { "myString": null } 

要么

 { "myStrung": "" } 

或(上帝帮助我)

 { "myString": "null" } 

我喜欢集合的约定在JSON中表示为一个空集合http://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html

一个空的数组将被表示:

 { "myArray": [] } 

编辑总结

“个人偏好”的论点似乎是现实的,但是由于社区将消耗更多不同的服务/来源, JSON结构的惯例将有助于规范化所述服务的消耗和重用。 至于build立一个标准,我会build议采纳绝大多数jackson公约,但有一些例外:

  • 对象比基元更受欢迎。
  • 空集合优于空。
  • 没有值的对象表示为空。
  • 基元返回它们的值。

如果您返回的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> 

让我们来评估每个的parsing:

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是JSON规范指示null应该表示的方式。 但是一如既往,这取决于你在做什么 – 有时候做“正确”的方式并不总是适合你的情况。 使用你的判断,做出明智的决定。


JSON1 {}

这返回一个空的对象。 这里没有数据,它只是告诉你,无论你寻找什么键(不pipe是myCount还是别的东西)都是undefinedtypes的。


JSON2 {"myCount": null}

在这种情况下, myCount实际上是定义的,虽然它的值是null 。 这与“not undefined and not null ”不一样,如果你正在testing一个条件或另一个条件,这可能会成功,而JSON1会失败。

这是根据JSON规范表示null的明确方法。


JSON3 {"myCount": 0}

在这种情况下,myCount是0.这不是一样的null ,它不是一样的false 。 如果你的条件语句评估myCount > 0 ,那么这可能是值得的。 而且,如果你正在根据这里的值运行计算,那么0可能是有用的。 如果你想testingnull ,那实际上根本就不行。


JSON4 {"myString": ""}

在这种情况下,你得到一个空string。 和JSON2一样,它是被定义的,但是它是空的。 你可以testingif (obj.myString == "")但是你不能testingnull或者undefined


JSON5 {"myString": "null"}

这可能会让你陷入麻烦,因为你将string值设置为null; 在这种情况下, obj.myString == "null"但它不是 == null


JSON6 {"myArray": []}

这将告诉你,你的数组myArray存在,但它是空的。 如果您正在尝试对myArray进行计数或评估,这非常有用。 例如,假设你想评估一个用户发布的照片​​数量 – 你可以做myArray.length ,它会返回0 :defined,但是没有发布照片。

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

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

  2.1。 值

一个JSON值必须是一个对象,数组,数字或string,或者其中之一
以下三个字面名称:

   false null为true

在这里输入图像说明

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

另一方面,如果该特定键不适用,则使用{} 。 例如,对于“没有任何汽车的人”,不应该向“有连接的汽车的数量”的问题显示计数,即使null

除非违约是有道理的,否则我会避免违约。 当然不要用"null"来表示没有价值。

只有一种方法来表示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表示的客户端使用===运算符; 这可能是他们的问题。

没有价值

如果你想expression你有一个对象的属性myCount没有价值:

 { "myCount": null } 

没有属性/缺less的属性

如果你传达你有一个没有属性的对象,那该怎么办呢?

 {} 

客户端代码将尝试访问myCount并得到undefined ; 它不在那里。

空集合

如果你传达一个属性为myCount的对象是一个空列表:

 { "myCount": [] } 

我会为variables的数据typesselect“default”(string/对象为null ,数字为0 ),但确实检查将使用该对象的代码需要什么。 不要忘记那里有null /默认与“不存在”之间的区别。

检出空对象模式 – 有时最好传递一些特殊的对象而不是null (即数组而不是null )。

这是一个个人和情境的select。 要记住的重要一点是空string和数字零在概念上不同于null

count的情况下,你可能总是想要一些有效的数字(除非count是未知的或未定义的),但是在string的情况下,谁知道? 空string可能意味着在您的应用程序中。 或者也许没有。 这取决于你自己决定。