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

例如,如果我在服务器上的对象有一个名为“myCount”的整数,没有值,最正确的JSON值将是:

{}

or

{
    "myCount": null
}

or

{
    "myCount": 0
}

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

{}

or

{
    "myString": null
}

or

{
    "myString": ""
}

或者(上帝帮助我)

{
    "myString": "null"
}

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

一个空数组将被表示:

{
    "myArray": []
}

编辑总结

“个人偏好”的论点似乎是现实的,但目光短浅,作为一个社区,我们将消费越来越多的不同的服务/资源。JSON结构的约定将有助于规范上述服务的使用和重用。至于建立标准,我建议采用杰克逊的大部分约定,只有少数例外:

对象优先于原语。 空集合优先于空集合。 没有值的对象表示为null。 原语返回它们的值。

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

当前回答

只有一种方法来表示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表示使用===操作符;这对他们来说可能是个问题。

没有任何价值

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

{ "myCount": null }

没有属性/缺少属性

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

{}

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

空集合

如果你想传达你有一个带有myCount属性的对象,它是一个空列表:

{ "myCount": [] }

其他回答

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

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

我会避免默认值,除非默认值有意义。虽然你可以决定使用null来表示没有值,但绝对不要使用“null”来这样做。

According to the JSON spec, the outermost container does not have to be a dictionary (or 'object') as implied in most of the comments above. It can also be a list or a bare value (i.e. string, number, boolean or null). If you want to represent a null value in JSON, the entire JSON string (excluding the quotes containing the JSON string) is simply null. No braces, no brackets, no quotes. You could specify a dictionary containing a key with a null value ({"key1":null}), or a list with a null value ([null]), but these are not null values themselves - they are proper dictionaries and lists. Similarly, an empty dictionary ({}) or an empty list ([]) are perfectly fine, but aren't null either.

在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

只有一种方法来表示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表示使用===操作符;这对他们来说可能是个问题。

没有任何价值

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

{ "myCount": null }

没有属性/缺少属性

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

{}

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

空集合

如果你想传达你有一个带有myCount属性的对象,它是一个空列表:

{ "myCount": [] }

'null'最适合实际使用

FWIW,以PHP为例,PHP将空集解释为PHP创建的条目…

// This loop will iterate one item with the value 'the car'
$empty_json = '["the car"]';
$some_json_array = json_decode($empty_json);

foreach ($some_json_array as $i) {
  echo "PHP sees one item";
}

输出:PHP看到汽车

// This loop will iterate one item, but with no values
$empty_json = '[""]';
$some_json_array = json_decode($empty_json);

foreach ($some_json_array as $i) {
  echo "PHP sees: $i";
}

输出:PHP看到

// This loop will iterate nothing because PHP's `json_decode()` function knew it was `null`
$empty_json = 'null';
$some_json_array = json_decode($empty_json);

foreach ($some_json_array as $i) {
  echo "PHP sees one item";
}

输出:(什么都没有,foreach不会循环)

这是个人的、情境性的选择。重要的是要记住,空字符串和数字0在概念上与null是不同的。

在计数的情况下,您可能总是想要一些有效的数字(除非计数未知或未定义),但在字符串的情况下,谁知道呢?在应用程序中,空字符串可能意味着什么。也可能不是。这由你来决定。