2

我有两个要合并的 json 文件。JSON 具有不同的格式(见下文)。我想合并记录,因此文件一中的 [0] 和文件二中的 [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 中的所有键都不相同(嗯,实际上“名称”是两者中的一个键,但第一个键是“名称”,第二个键是“名称” - 这样我就可以检查合并工作正常 - 所以我想要最终 JSON 中的“名称”和“名称”),第一个文件中的第一条记录与第二个文件中的第一条记录匹配,依此类推。

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

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

任何帮助表示赞赏。非常感谢。

4

1 回答 1

1

你好,格式似乎比上次改变了:)

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

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

是一个工作演示

顺便说一句,您的 json 在两个文件中都有点错误。

在此处此处查看固定版本

于 2012-11-22T18:41:25.793 回答