【问题标题】:Should null values be included in JSON responses from a REST API? [closed]来自 REST API 的 JSON 响应中是否应该包含空值? [关闭]
【发布时间】:2013-03-19 04:41:22
【问题描述】:

我正在设计和开发一个 RESTful API。我对 API 采取了一种务实的、面向资源的方法(面向资源、统一接口、可寻址性,但没有真正的 HATEOAS)。我不确定的一点是如何处理对象中的空值。

我应该在 API 响应中包含具有空值的字段吗?

例子:

{
    "fieldA": "AAA",
    "fieldB": null
}

或者,如果系统没有这些字段的数据,我应该完全省略这些字段吗?

例子:

{
    "fieldA": "AAA"
}

【问题讨论】:

标签: json api rest


【解决方案1】:

最近在API-Craft 上对此进行了讨论。普遍的共识是,省略值与包含空值之间可能存在语义差异。

如果没有为您的特定用例获得语义价值,那么我会说看看您的 API 的目标消费者,并考虑省略该值是否会给他们带来问题。

【讨论】:

  • 谢谢!我决定采用null 方法,因为它确实是最有意义的。我为我们的逻辑实体提供了几种表示形式,添加null 值可以更清楚地向客户传达该字段是表示形式的一部分,但该字段没有可用的数据。事后看来,这是一个真正的 d'oh! 时刻(这很有意义)。
  • 从stackoverflow上的问题来看,大部分iOS程序员对此不够聪明,null值会导致崩溃。并不是说你错了,但是拥有可能为 null 非常罕见 的值将是一个问题。至少对于测试而言,您需要能够生成充斥着 null 的数据,这样您以后就不会遇到意外。
  • 但我想那么省略该值也会导致这些 iOS 应用程序崩溃?我真的看不出这有什么不同。
  • 在 iOS 中省略字段不会使应用程序崩溃,从字典中获取键的 on 对象是可选值。所以程序员知道它可以是 nil
  • 我决定在我的路由上默认去除空值以节省带宽。我认为传输一堆没有任何内容的字段名称没有意义。如果有人需要空值 (?includeNullValues=true),我的所有路由都可以使用查询参数,主要用于测试/调试。我还有一个每个路由的字段名称异常列表,所以如果空值确实携带重要信息,我可以在给定字段的响应中保留空值。
【解决方案2】:

没有明确的赢家。由于没有,客户在技术上不应该依赖任何关于此的约定,客户不应该期望任何一种形状。

  • 删除空值以减少带宽使用通常是不合理的(除非空字段的数量很大并且带宽明显受到影响)。
  • 删除空值以让人类读者更容易看到实际值通常是不合理的,API 不是人机界面
  • 保留空值以使人类读者更容易看到文档结构通常不合理,API 不是人机界面,API 响应不是 API 文档
  • 保留 null 值以允许脏客户端以特定方式解析 json 通常是不合理的,客户端应作为宽容的阅读器编写干净
  • 仅在相应的创建方法 (POST/PUT) 需要显式传递 null 时才保留 null 值是有意义的,但通常很难实现
  • 在创建过程中保持与请求相同的输出当每个文档都有自己的客户端时可能有意义,但通常很难实现
  • 需要考虑的一个特殊情况是由 ?fields=foo,bar 之类的东西触发的部分响应,其中为所有其他字段返回 null 似乎有点违反直觉

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2017-11-04
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多