首页 文章

在JSON中表示null

提问于
浏览
266

在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 回答

  • 237

    让我们评估每个解析:

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


    JSON1 {}

    这将返回一个空对象 . 那里没有数据,而's only going to tell you that whatever key you'正在查找(无论是 myCount 还是别的)是 undefined 类型 .


    JSON2 {"myCount": null}

    在这种情况下, myCount 实际上是定义的,尽管它的值是 null . 这与“not undefined 而不是 null ”不同,如果您正在测试一个条件或另一个条件,这可能会成功,而JSON1会失败 .

    这是表示 nullthe 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 == "") ,但无法测试 nullundefined .


    JSON5 {"myString": "null"}

    这可能会让你遇到麻烦,因为你将字符串值设置为null;在这种情况下, obj.myString == "null" 但它不是 == null .


    JSON6 {"myArray": []}

    这将告诉您数组 myArray 存在,但是's empty. This is useful if you'正在尝试对 myArray 执行计数或求值 . 例如,假设您想评估用户发布的照片数量 - 您可以执行 myArray.length 并返回 0 :已定义,但未发布照片 .

  • 17

    null 不是零 . 它本身不是一个值:它是变量域之外的值,表示缺失或未知数据 .

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

    2.1 . 值

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

    false null true

    enter image description here

  • 0

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

    没有 Value

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

    { "myCount": null }
    

    没有属性/缺少属性

    如果你传达的是你有一个没有属性的对象怎么办:

    {}
    

    客户端代码将尝试访问 myCount 并获取 undefined ;它不在那里 .

    空集合

    如果您传达的是一个具有属性 myCount 的对象是空列表,该怎么办?

    { "myCount": [] }
    
  • 174

    我会使用 null 来表明该特定键没有值 . 例如,使用 null 表示"number of devices in your household connects to internet"未知 .

    另一方面,如果该特定键不适用,请使用 {} . 例如,即使 null ,也不应向不拥有任何车辆的人询问"number of cars that has active internet connection"的计数 .

    我会避免默认任何值,除非默认有意义 . 虽然您可能决定使用 null 来表示没有值,但肯定不会使用 "null" 来执行此操作 .

  • 6

    我会选择"default"作为变量的数据类型( null 用于字符串/对象, 0 用于数字),但确实检查将消耗对象所需的代码 . 不要忘记 null / default与"not present"之间有时会有区别 .

    查看null object pattern - 有时最好传递一些特殊对象而不是 null (即 [] 数组而不是 null 代表数组或 "" 代表字符串) .

  • 13

    这是个人和情境选择 . 要记住的重要一点是,空字符串和数字零在概念上与 null 不同 .

    count 的情况下,您可能总是想要一些有效数字(除非 count 未知或未定义),但在字符串的情况下,谁知道?空字符串可能意味着您的应用程序 . 或者它可能不是由你决定的 .

  • 2

    根据JSON spec,最外面的容器不必是上面大多数注释中暗示的字典(或'object') . 它也可以是列表或裸值(即字符串,数字,布尔值或空值) . 如果要在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
    
  • 0

    使用此示例使用Java和JSON代码时 .

    { "myString" : "" }
    

    我发现这不起作用

    if(obj.myString=="")
    

    但是这样做了 .

    if(obj.getString("myString").equals(""))
    

相关问题