将JSON中的记录与Ruby合并

时间:2012-11-22 18:24:20

标签: ruby jruby

我有两个json文件,我正在尝试合并。 JSON具有不同的格式(见下文)。我想合并记录,因此文件1中的[0]和文件2中的[0]将成为新合并文件中的一个记录[0]。

第一个JSON(file_a.json),如下所示:

{

    "query": {
        "count": 4,
        "created": "2012-11-21T23:07:00Z",
        "lang": "en-US",
        "results": {
            "quote": [
                {
                    "Name": "Bill",
                    "Age": "46",
                    "Number": "3.55"
                },
                {
                    "Name": "Jane",
                    "Age": "33",
                    "Number": nil
                },
                {
                    "Name": "Jack",
                    "Age": "55",
                    "Number": nil
                },
                {
                    "Name": "Xavier",
                    "Age": nil,
                    "Number": "153353535"
                }
            ]
        }
    }

}

第二个JSON(file_b.json)如下所示:

[

    {
        "Number2": 25253,
        "Number3": 435574,
        "NAME": "Bill"
    },
    {
        "Number2": 345353,
        "Number3": 5566,
        "NAME": "Jane"
    },
    {
        "Number2": 56756,
        "Number3": 232435,
        "NAME": "Jack"
    },
    {
        "Number2": 7457,
        "Number3": 45425,
        "NAME": "Xavier"
    }
]

两个JSON中的密钥都不相同(嗯,实际上“名称”是两者中的一个键,但是第一个键是“Name”,第二个键是“NAME” - 所以我可以查看合并工作正常 - 所以我想在最终的JSON中使用“Name”和“NAME”,第一个文件中的第一个记录与第二个文件中的第一个记录匹配,依此类推。

到目前为止,我尝试合并这样:

merged = %w[a b].inject([]) { |m,f| m << JSON.parse(File.read("file_#{f}.json")) }.flatten

但是这当然合并了它们,但不是我想要它们合并的方式(它们合并得太过分了,因为格式不同,它会变得非常丑陋)。

我也试过这样合并:

a = JSON.parse(File.read("file_a.json"))
b = JSON.parse(File.read("file_b.json"))

merged = a.zip(b)

靠近但仍然不正确,格式化仍然是可怕的。

最后,我想要的是这个(第二个JSON的格式 - 来自第一个JSON的标题可以被废弃):

[

    {
        "Name": "Bill",
        "Age": 46,
        "Number": 3.55,
        "Number2": 25253,
        "Number3": 435574,
        "NAME": "Bill"
    },
    {
        "Name": "Jane",
        "Age": 33,
        "Number": nil,
        "Number2": 345353,
        "Number3": 5566,
        "NAME": "Jane"
    },
    {
        "Name": "Jack",
        "Age": 55,
        "Number": nil,
        "Number2": 56756,
        "Number3": 232435,
        "NAME": "Jack"
    },
    {
        "Name": "Xavier",
        "Age": nil,
        "Number": 153353535,
        "Number2": 7457,
        "Number3": 45425,
        "NAME": "Xavier"
    }
]

感谢任何帮助。非常感谢。

1 个答案:

答案 0 :(得分:1)

Hеllo,似乎格式从上次改变了:)

更新:更可读的版本,也将相应的值转换为整数/浮点数:

require 'json'
require 'ap'

a = JSON.parse(File.read('./a.json'))['query']['results']['quote'] rescue []
b = JSON.parse(File.read('./b.json'))

final = []
a.each_with_index do |ah,i|
  unless bh = b[i]
    bh = {}
    puts "seems b has no #{i} key, merging skipped"
  end

  final << ah.merge(bh).inject({}) do |f, (k,v)|
    if v.is_a?(String)
      if v =~ /\A\d+\.\d+\Z/
        v = v.to_f
      elsif v =~ /\A\d+\Z/
        v = v.to_i
      end
    end
    f.update k => v
  end
end
ap final

将显示:

[
  [0] {
       "Name" => "Bill",
      "Age" => 46,
     "Number" => 3.55,
    "Number2" => 25253,
    "Number3" => 435574,
       "NAME" => "Bill"
  },
  [1] {
       "Name" => "Jane",
      "Age" => 33,
     "Number" => nil,
    "Number2" => 345353,
    "Number3" => 5566,
       "NAME" => "Jane"
  },
  [2] {
       "Name" => "Jack",
      "Age" => 55,
     "Number" => nil,
    "Number2" => 56756,
    "Number3" => 232435,
       "NAME" => "Jack"
  },
  [3] {
       "Name" => "Xavier",
      "Age" => nil,
     "Number" => 153353535,
    "Number2" => 7457,
    "Number3" => 45425,
       "NAME" => "Xavier"
  }
]

Here是一个有效的演示

顺便说一下,你的json在两个文件中都有点不对。

查看固定版本herehere