在Ruby中,递归地从JSON字符串中删除空白项

3

我有一个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字符串中所有空值的最佳方法?(请注意,在此示例中,variants仅为简化起见而深度为一级。实际上,它可以有多个级别。)

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

[{"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”。 - Anthony
我的回答有帮助到 @Mike 吗? - Anthony
@Anthony 是的,它运行得很好 - 谢谢。试图点赞,但我需要15个声望。 - Mike Potter
@Anthony 谢谢 - 我是新来的,但已经做到了。 - Mike Potter
3个回答

2
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"}]}]

1
require 'json'

json = JSON.parse(your_json)
json.first.reject! do |key, value|
  value == ''
end
puts json.to_s

谢谢Matt - 但我认为它没有递归地遍历整个JSON字符串? - Mike Potter
啊,我没有看到你右侧完全嵌套的数组。 - Matt Gibson

0
注意,我必须将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
你是对的 @iNulty - 我会删除我的,采用你的。 - Anthony
JSON反序列化现在让我在Ruby中感到很烦。JSON.load的这个proc参数文档资料明显不足。 - iNulty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接