在Ruby中使用分层JSON生成扁平JSON(denormalize)的最佳方法

我正在努力实现以下目标。 我的输入JSON看起来像这样,

{ "data":{ "shipping_address":[ { "cust_id":"CUST-123", "street":"123 Main St", "city":"Atlanta", "state":"GA", "zip":"12345" }, { "cust_id":"CUST-456", "street":"456 Front St", "city":"Philadelphia", "state":"PA", "zip":"23456" } ], "orders":[ { "cust_id":"CUST-456", "items":[ { "quantity":"2", "item_code":"ABC-111-222", "cust_id":"CUST-456" }, { "quantity":"1", "item_code":"DEF-999-01-001", "cust_id":"CUST-456" } ] }, { "cust_id":"CUST-123", "items":[ { "quantity":"10", "item_code":"998-111-222", "cust_id":"CUST-123" } ] } ], "payment":[ { "cust_id":"CUST-123", "type":"VISA", "card_no":"1234-1111-2222-3333", "expiry":"06/2016", "billing_add_same_as_shipping":"Y", "first_name":"John", "last_name":"Smith" }, { "cust_id":"CUST-456", "type":"VISA", "card_no":"5678-4444-8877-5544", "expiry":"08/2016", "billing_add_same_as_shipping":"N", "first_name":"Steve", "last_name":"Jones" } ], "billing_address":[ { "cust_id":"CUST-456", "street":"7788 Back St", "city":"Gainesville", "state":"FL", "zip":"33444" } ] } } 

我想把这个json变成两个独立的jsons

 { "data":{ "shipping_address":{ "cust_id":"CUST-456", "street":"456 Front St", "city":"Philadelphia", "state":"PA", "zip":"23456" }, "orders":{ "cust_id":"CUST-456", "items":[ { "quantity":"2", "item_code":"ABC-111-222", "cust_id":"CUST-456" }, { "quantity":"1", "item_code":"DEF-999-01-001", "cust_id":"CUST-456" } ] }, "payment":{ "cust_id":"CUST-456", "type":"VISA", "card_no":"5678-4444-8877-5544", "expiry":"08/2016", "billing_add_same_as_shipping":"N", "first_name":"Steve", "last_name":"Jones" }, "billing_address":{ "cust_id":"CUST-456", "street":"7788 Back St", "city":"Gainesville", "state":"FL", "zip":"33444" } } } 

 { "data":{ "shipping_address":{ "cust_id":"CUST-123", "street":"123 Main St", "city":"Atlanta", "state":"GA", "zip":"12345" }, "orders":{ "cust_id":"CUST-123", "items":[ { "quantity":"10", "item_code":"998-111-222", "cust_id":"CUST-123" } ] }, "payment":{ "cust_id":"CUST-123", "type":"VISA", "card_no":"1234-1111-2222-3333", "expiry":"06/2016", "billing_add_same_as_shipping":"Y", "first_name":"John", "last_name":"Smith" } } } 

Ruby中是否有一种简单的方法可以执行此操作而无需对输入json的每个片段进行循环/解析(即通过执行任何JSON映射)?

这是我目前的解决方案

注意:我的输入是来自Java的POJO,其中evaluationTarget包含输入JSON

 def json_flattening(input) customer_order_hash = Hash.new orders_data = input.evaluationTarget orders_data.keys.each do |orders_keys| orders_data[orders_keys].each do |orders_keys_data| if !customer_order_hash.has_key?(orders_keys_data['cust_id']) then each_order_hash = Hash.new customer_order_hash[orders_keys_data['cust_id']] = each_order_hash end customer_order_hash[orders_keys_data['cust_id']][orders_keys] = orders_keys_data end end customer_order_hash.keys.each do |cust_id| puts customer_order_hash[cust_id] end end {"shipping_address"=>{"cust_id"=>"CUST-123", "street"=>"123 Main St", "city"=>"Atlanta", "state"=>"GA", "zip"=>"12345"}, "orders"=>{"cust_id"=>"CUST-123", "items"=>#}, "payment"=>{"cust_id"=>"CUST-123", "type"=>"VISA", "card_no"=>"1234-1111-2222-3333", "expiry"=>"06/2016", "billing_add_same_as_shipping"=>"Y", "first_name"=>"John", "last_name"=>"Smith"}} {"shipping_address"=>{"cust_id"=>"CUST-456", "street"=>"456 Front St", "city"=>"Philadelphia", "state"=>"PA", "zip"=>"23456"}, "orders"=>{"cust_id"=>"CUST-456", "items"=>#}, "payment"=>{"cust_id"=>"CUST-456", "type"=>"VISA", "card_no"=>"5678-4444-8877-5544", "expiry"=>"08/2016", "billing_add_same_as_shipping"=>"N", "first_name"=>"Steve", "last_name"=>"Jones"}, "billing_address"=>{"cust_id"=>"CUST-456", "street"=>"7788 Back St", "city"=>"Gainesville", "state"=>"FL", "zip"=>"33444"}}