【问题标题】:In Ruby, recursively remove blank items from json string在 Ruby 中,递归地从 json 字符串中删除空白项
【发布时间】:2015-08-06 07:13:39
【问题描述】:

我有一个 JSON 字符串,我需要从中删除所有空白值。比如:

[{"body":"","user":"mike","id":1234567,"type":"","published_at":"2015-05-22T14:51:00-04:00","title":null,"updated_at":"2015-05-23T22:04:38-04:00","postoffice":"Testing","tags":"","variants":[{"value":"", "service":"canada post"}]}]

我考虑过检查所有元素并测试它们是否为“”,并且我还考虑过通过 JSON.load 加载 JSON 并让 proc 选项删除空白(尽管我对 Ruby 相当陌生并且不知道该怎么做)。

从 JSON 字符串中递归删除所有空白值的最佳方法是什么? (请注意,在此示例中,为简化起见,变体只有一层深度。实际上它可以是多层深度。)

为了完整起见,最终结果应如下所示:

[{"user":"mike","id":1234567,"published_at":"2015-05-22T14:51:00-04:00","title":null,"updated_at":"2015-05-23T22:04:38-04:00","postoffice":"Testing","variants":[{"service":"canada post"}]}]

(在我的情况下,空值是可以的)。

【问题讨论】:

  • 请注意,ruby 中没有“null”。
  • 我的回答对@Mike 有帮助吗?
  • @Anthony 是的,它确实工作得很好 - 谢谢。试图支持它,但我需要 15 声望。
  • @Anthony 谢谢 - 我是新来的,但我就是这么做的。

标签: ruby-on-rails ruby json recursion is-empty


【解决方案1】:
require 'json'

JSON.load(json, proc do |a|
  a.is_a?(Hash) && a.delete_if do |_k,v|
    next unless v.is_a?(String)
    v.empty?
  end
end

结果:

[{"user"=>"mike",
  "id"=>1234567,
  "published_at"=>"2015-05-22T14:51:00-04:00",
  "title"=>nil,
  "updated_at"=>"2015-05-23T22:04:38-04:00",
  "postoffice"=>"Testing",
  "variants"=>[{"service"=>"canada post"}]}]

【讨论】:

    【解决方案2】:

    请注意,我必须将 null 更改为 nil,这样它才能成为有效的 ruby​​ 哈希。结果有点冗长,但完成了工作:

    def strip_empties(json)
      json.each_with_object([]) do |record, results|
        record.each do |key, value|
          if value.is_a? Array
            results << { key => strip_empties(value) }
          else
            results << { key => value } unless value == ""
          end
        end
      end
    end
    
    result = strip_empties(json)
    

    带有nil 但没有空字符串的输出:

    => [{:user=>"mike"},
     {:id=>1234567},
     {:published_at=>"2015-05-22T14:51:00-04:00"},
     {:title=>nil},
     {:updated_at=>"2015-05-23T22:04:38-04:00"},
     {:postoffice=>"Testing"},
     {:variants=>[{:service=>"canada post"}]}]
    

    【讨论】:

    • 这与原始 json 对象不同。原始的 json 数组有一个对象有很多字段,这是一个有很多哈希的数组
    • 你是对的@iNulty - 我会删除以支持你的
    • JSON 反序列化现在在 ruby​​ 中让我很烦恼。 JSON.load 的这个 proc 参数记录不足。
    【解决方案3】:
    require 'json'
    
    json = JSON.parse(your_json)
    json.first.reject! do |key, value|
      value == ''
    end
    puts json.to_s
    

    【讨论】:

    • 谢谢马特 - 但我不认为这会递归地遍历整个 JSON 字符串?
    • 啊。一直没有看到您的嵌套数组。
    猜你喜欢
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 2012-07-02
    • 1970-01-01
    相关资源
    最近更新 更多