在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公约,但有一些例外:
如果您要返回一个大多数为空值的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>
让我们评估每个的解析:
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。但是,一如既往,这取决于您的工作- 有时,“正确”的做法并不总是适合您的情况。使用您的判断并做出明智的决定。
json2 变量中的片段是JSON规范所表示的方式null。但是,一如既往,这取决于您的工作- 有时,“正确”的做法并不总是适合您的情况。使用您的判断并做出明智的决定。
null
JSON1{}
这将返回一个空对象。那里没有数据,只会告诉您您要寻找的任何键(无论是键还是其他键myCount)都是type undefined。
myCount
undefined
JSON2{"myCount": null}
{"myCount": null}
在这种情况下,myCount实际上是定义了,尽管其值为null。这是 不 一样的两个“不undefined,不null”,如果你是一个条件或其他测试,这可能会成功,而JSON1会失败。
这是null按照JSON规范表示的确定方式。
JSON3{"myCount": 0}
{"myCount": 0}
在这种情况下,myCount为0。与null,和并不相同false。如果您的条件语句评估为myCount > 0,那么这可能是值得的。此外,如果您基于此处的值运行计算,则0可能会有用。null但是,如果您要进行测试,那么这实际上是行不通的。
false
myCount > 0
JSON4{"myString": ""}
{"myString": ""}
在这种情况下,您将得到一个空字符串。同样,与JSON2一样,它已定义,但它为空。您可以测试,if (obj.myString == "")但不能测试null或undefined。
if (obj.myString == "")
JSON5{"myString": "null"}
{"myString": "null"}
这很可能会给您带来麻烦,因为您将 字符串 值设置为null。在这种情况下,obj.myString == "null"但它是 不是 == null。
obj.myString == "null"
== null
JSON6{"myArray": []}
{"myArray": []}
这将告诉您数组myArray存在,但它为空。如果您要对进行计数或评估,这将很有用myArray。例如,假设您要评估用户发布的照片数量- 您可以这样做myArray.length,它将返回0:defined,但没有发布照片。
myArray
myArray.length
0