在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
还是别的东西)都是undefined
types的。
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可能意味着在您的应用程序中。 或者也许没有。 这取决于你自己决定。