【问题标题】:Render JSON: Remove null fields渲染 JSON:删除空字段
【发布时间】:2019-02-22 12:03:21
【问题描述】:

Ruby-on-Rails API 呈现 JSON 时,我需要避免出现空字段:

def index
  @items = Item.all
  render json: @items,
end

如果我的 Item 对象包含 nil 字段,则它们在 JSON 中被序列化为 null。我只想从我的 JSON 中消除空字段。

render 是否有任何选项可用于此目的?

编辑:示例输出

[{
    "id": 2,
    "code": "code",
    "list_id": 1,
    "created_by": "me",
    "comment": null
}]

编辑:this post 的重复项?

提到的帖子的答案并不通用。我想通过render 上的简单参数找到一个适用于任何地方的解决方案(例如,一些skip_nil_values 参数)。这篇文章的答案也没有提到如何去做,也没有提到如何在返回的 JSON 中系统地处理嵌套对象。

我希望避免在我的 API 中到处出现臃肿的 as_json,每次都为每个新端点手动重新定义。

作为最后一个论点,提到的帖子指的是Rails 3.2。我在Rails 5.2。这两个版本之间可能会有一些改进。

【问题讨论】:

  • 你能给我一个样本输出吗?
  • 这可能会导致 API 混乱。现在消费者必须检查是否有评论属性,因为它是暂时的。是否有理由认为 null 或空字符串不合适?
  • 原因是我有一个独特的消费者,它是一个Kotlin Android 应用程序。这个应用程序的负责开发人员告诉我他无法处理这种语言的空值。此外,为什么要发送会增加有效负载的空值?如果没有空值,JSON 会更轻。 This is my source.

标签: ruby-on-rails json


【解决方案1】:

Rails 中有一个compact 方法,它返回一个非零值的哈希值。 您可以使用: @items.map(&:compact)

【讨论】:

  • 没有更通用的做法了吗?我想避免为我将拥有的每个新端点都这样做。此外,嵌套对象会很复杂。
  • 请查看此链接,这可能对您有所帮助。 stackoverflow.com/questions/7914022/…
【解决方案2】:

在您的应用程序控制器中创建以下私有方法(随意命名)。

def format_collection obj_col
  obj_col.as_json.each do |obj|
    obj.reject! { |key, value| value.nil? }
  end
end

将您的渲染线替换为以下内容。

render json: format_collection @items

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 2018-11-13
    • 2018-12-23
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多