【问题标题】:How to clean up / transform JSON data when reading it in?读取时如何清理/转换 JSON 数据?
【发布时间】:2014-08-11 14:28:07
【问题描述】:

什么是清理(转换)格式不正确的 JSON 哈希数组的一种干净且惯用的方法,其结构如下所示,假设哈希中的键总是格式正确?

在此示例中,邮政编码和电话号码的格式不同,并且只有一个哈希值中存在一个键/值对 street_address。我想要做的是将所有邮政编码传递给一个解析邮政编码的助手,将电话号码传递给电话号码清理器,并将街道地址(如果存在)传递给它自己的解析器。我想保留 JSON 数组的结构,只是将值标准化。

[{      "name": "Person 1",
    "postal_code": "VXXXS",
    "phone_number": "(111)093910",
}, 
{      "name": "Person 2",
    "postal_code": "VX-XXS",
    "phone_number": "++(111)093139",
}, 
{      "name": "Person 3",
    "street_address": "1 Something Rd",
}]

我正在考虑遍历每个数组元素,然后使用如下 switch 语句:

json.each do |hash|
 hash.keys do |key|
  case key
  when "postal_code"
    hash[key] = postal_code_parser(hash[key])
  when "street_address"
    hash[key] = street_address_parser(hash[key])
  when "phone_number"
    hash[key] = phone_number_parser(hash[key])
  end
 end
end

但这有点难看,我认为这可能是一个常见的问题,以至于存在一种干净且更有效的方法来解决它。我仍然觉得红宝石势不可挡。

【问题讨论】:

    标签: ruby-on-rails ruby json


    【解决方案1】:

    最简单的方法是通过键显式调用值:

    json.each do |hash|
      hash["postal_code"] = postal_code_parser(hash["postal_code"]) if hash.key?("postal_code")
      hash["street_address"] = street_address_parser(hash["street_address"]) if hash.key?("street_address")
      hash["phone_number"] = phone_number_parser(hash["phone_number"]) if hash.key?("phone_number")
    end
    

    每行末尾的if 表示如果未设置该键的值,则不会调用代码。

    如果你想让它更通用和动态,你可以为每个键保留一个解析器列表:

    parsers = {"postal_code" => :postal_code_parser,
               "street_address" => :street_address_parser
               "phone_number" => :phone_number_parser}
    
    json.each do |hash|
      parsers.each do |key, parser|
        hash[key] = send(parser, hash[key]) if hash.key?(key)
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-07
      • 1970-01-01
      • 2013-05-05
      相关资源
      最近更新 更多