在JSON中返回空值的首选方法是什么?对于原语有不同的偏好吗?
例如,如果服务器上的对象有一个名为“myCount”且没有值的Integer,那么该值的最正确的JSON将是:
{}
要么
{
"myCount": null
}
要么
{
"myCount": 0
}
字符串的相同问题 - 如果我在服务器上有一个空字符串“myString”,则是最好的JSON:
{}
要么
{
"myString": null
}
要么
{
"myStrung": ""
}
或者(上帝帮助我)
{
"myString": "null"
}
我喜欢集合的约定在JSON中表示为空集合http://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html
将显示一个空数组:
{
"myArray": []
}
EDIT Summary
“个人偏好”的观点似乎是现实的,但其中很短,因为社区将消耗更多不同的服务/来源 . JSON结构的约定将有助于规范化所述服务的消耗和重用 . 至于 Build 一个标准,我建议采用大多数 Jackson 公约,但有一些例外:
-
对象优先于基元 .
-
空集合优先于null .
-
没有值的对象表示为null .
-
Primitives返回它们的值 .
如果要返回一个主要为空值的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>
8 回答
让我们评估每个解析:
http://jsfiddle.net/brandonscript/Y2dGv/
JSON1 {}
这将返回一个空对象 . 那里没有数据,而's only going to tell you that whatever key you'正在查找(无论是
myCount
还是别的)是undefined
类型 .JSON2 {"myCount": null}
在这种情况下,
myCount
实际上是定义的,尽管它的值是null
. 这与“notundefined
而不是null
”不同,如果您正在测试一个条件或另一个条件,这可能会成功,而JSON1会失败 .这是表示
null
每the JSON spec的明确方式 .JSON3 {"myCount": 0}
在这种情况下,myCount为0.这与
null
不同,它与false
不同 . 如果条件语句评估myCount > 0
,那么这可能是值得的 . 而且,如果你试图测试null
,但实际上这根本不起作用 .JSON4 {"myString": ""}
在这种情况下,您定义了're getting an empty string. Again, as with JSON2, it',但它是空的 . 您可以测试
if (obj.myString == "")
,但无法测试null
或undefined
.JSON5 {"myString": "null"}
这可能会让你遇到麻烦,因为你将字符串值设置为null;在这种情况下,
obj.myString == "null"
但它不是== null
.JSON6 {"myArray": []}
这将告诉您数组
myArray
存在,但是's empty. This is useful if you'正在尝试对myArray
执行计数或求值 . 例如,假设您想评估用户发布的照片数量 - 您可以执行myArray.length
并返回0
:已定义,但未发布照片 .null
不是零 . 它本身不是一个值:它是变量域之外的值,表示缺失或未知数据 .只有一种方法可以在JSON中表示
null
. 根据规格(RFC 4627和json.org):JSON值必须是对象,数组,数字或字符串,或者是其中之一
以下三个字面名称:
false null true
只有一种方法可以表示
null
;那是null
.也就是说;如果使用JSON表示的任何客户端使用
===
运算符;这可能是他们的问题 .没有 Value
如果你想传达你有一个属性
myCount
没有值的对象:没有属性/缺少属性
如果你传达的是你有一个没有属性的对象怎么办:
客户端代码将尝试访问
myCount
并获取undefined
;它不在那里 .空集合
如果您传达的是一个具有属性
myCount
的对象是空列表,该怎么办?我会使用
null
来表明该特定键没有值 . 例如,使用null
表示"number of devices in your household connects to internet"未知 .另一方面,如果该特定键不适用,请使用
{}
. 例如,即使null
,也不应向不拥有任何车辆的人询问"number of cars that has active internet connection"的计数 .我会避免默认任何值,除非默认有意义 . 虽然您可能决定使用
null
来表示没有值,但肯定不会使用"null"
来执行此操作 .我会选择"default"作为变量的数据类型(
null
用于字符串/对象,0
用于数字),但确实检查将消耗对象所需的代码 . 不要忘记null
/ default与"not present"之间有时会有区别 .查看null object pattern - 有时最好传递一些特殊对象而不是
null
(即[]
数组而不是null
代表数组或""
代表字符串) .这是个人和情境选择 . 要记住的重要一点是,空字符串和数字零在概念上与
null
不同 .在
count
的情况下,您可能总是想要一些有效数字(除非count
未知或未定义),但在字符串的情况下,谁知道?空字符串可能意味着您的应用程序 . 或者它可能不是由你决定的 .根据JSON spec,最外面的容器不必是上面大多数注释中暗示的字典(或'object') . 它也可以是列表或裸值(即字符串,数字,布尔值或空值) . 如果要在JSON中表示空值,则整个JSON字符串(不包括包含JSON字符串的引号)只是
null
. 没有大括号,没有括号,没有引号 . 您可以指定包含具有空值的键({"key1":null}
)或具有空值的列表([null]
)的字典,但这些字段本身不是空值 - 它们是正确的字典和列表 . 类似地,空字典({}
)或空列表([]
)完全没问题,但也不是空的 .在Python中:
使用此示例使用Java和JSON代码时 .
我发现这不起作用
但是这样做了 .