2

マージしようとしている 2 つの json ファイルがあります。JSON の形式は異なります (以下を参照)。レコードをマージしたいので、ファイル 1 の [0] とファイル 2 の [0] は、マージされた新しいファイルでは 1 つのレコード [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"
                }
            ]
        }
    }

}

2 番目の 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 で同じキーはありません (実際には「名前」は両方のキーですが、最初のキーは「名前」で、2 番目のキーは「NAME」です。正しく動作するため、最終的な JSON に「Name」と「NAME」が必要です)、最初のファイルの最初のレコードは 2 番目のファイルの最初のレコードと一致します。

これまでのところ、次のようにマージしてみました。

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)

近づいてきましたが、まだ正しくなく、フォーマットは依然として恐ろしいものでした.

最後に、私が欲しいのはこれです(2番目の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 に答える