2016-11-23 4 views
2

オブジェクトと配列を含むjsonファイルをJSONファイルに変換しようとしています。RubyでJSONをハッシュマップに変換する

は以下

{ 
    "localbusiness":{ 
     "name": "toto", 
     "phone": "+11234567890" 
    }, 
    "date":"05/02/2016", 
    "time":"5:00pm",  
    "count":"4", 
    "userInfo":{ 
     "name": "John Doe", 
     "phone": "+10987654321", 
     "email":"[email protected]", 
     "userId":"user1234333" 
    } 
} 

私の目標は、このようなMongoIdとしてデータベースで保存することですJSONファイルです。私のような何かを得るためにマップを使用したい:私は、各エントリを解析する方法を本当にない私はマップを試してみましたが、それは地元のビジネスやのUserInfo

def format_entry 
    ps = @params.map do | h | 
    ps.merge!(h) 
    @@logger.info("entry #{h}") 
    end 
    @@logger.info("formatting the data #{ps}") 
    ps 
end 

の配列を分割いない

localbusiness_name => "toto", 
localbusiness_phone => "+11234567890", 
date => "05/02/2016", 
... 
userInfo_name => "John Doe" 
... 

をし、名前を再構築する

+0

'@ params'はJSONハッシュかRails変数ですか? 'format_entry'の出力を表示することは可能ですか? –

+0

@ElijahSchutz形式のエントリが機能していません。 paramsはJSONハッシュです – Seb

+0

JSONファイルをテキストとして持ち、ネストされたハッシュに変換しますか?もしそうなら、 'require 'json'; myhash = JSON.parse(text); 'これを行います。 –

答えて

3

内側のハッシュを1つの大きなハッシュに「平坦化」しようとしているようです。ハッシュのキーをサブハッシュのキーの前に付加したいので、正しくない状態になります。これには、ハッシュをループし、各サブハッシュを再度ループする必要があります。このコード例は、1つのレイヤーが深い場合にのみ機能します。複数のレイヤーがある場合は、2つのメソッドまたは再帰的メソッドを作成することをお勧めします。

@business = { # This is a hash, not a json blob, but you can take json and call JSON.parse(blob) to turn it into a hash. 
    "localbusiness":{ 
     "name": "toto", 
     "phone": "+11234567890" 
    }, 
    "date":"05/02/2016", 
    "time":"5:00pm", 
    "count":"4", 
    "userInfo":{ 
     "name": "John Doe", 
     "phone": "+10987654321", 
     "email":"[email protected]", 
     "userId":"user1234333" 
    } 
} 

@squashed_business = Hash.new 

@business.each do |k, v| 
    if v.is_a? Hash 
    v.each do |key, value| 
     @squashed_business.merge! (k.to_s + "_" + key.to_s) => value 
    end 
    else 
    @squashed_business.merge! k => v 
    end 
end 

私はそれはあなたのキーと値の両方を与えるので、ハッシュ@params.each { |h| ... }を超える列挙したときに、「予期せぬ」の結果を得ていることに気づきました。代わりに、上記のコード例のように@params.each { |key, value| ... }を実行します。

+0

いいえ、私の答えはあなたを改善しないでしょう。私はそれを見てすぐに私はそれをupvotedと私はあなたのコメントを見たときに鉱山を削除しようとしていた。 –

+0

ありがとうございます。私たち全員が手伝っています!私は 'class'を使ってあなたの答えにクールな/似たようなことをしたと思いますか? – Dbz

+0

あなたの道がより効率的で、より直接的であるとわかりました。そして重要な点は、OPには解決策があることです。あなたはそれを正しく指摘した。私たちはすべてここにいます。 –

関連する問題