用Ruby中的分层JSON生成扁平JSON(非规范化)的最佳方法
我正在努力实现以下目标。我的输入JSON如下所示用Ruby中的分层JSON生成扁平JSON(非规范化)的最佳方法,ruby,json,Ruby,Json,我正在努力实现以下目标。我的输入JSON如下所示 { "data":{ "shipping_address":[ { "cust_id":"CUST-123", "street":"123 Main St", "city":"Atlanta", "state":"GA", "zip":"12345" },
{
"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分解成两个独立的json
{
"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"
}
}
}
及
在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"=>#<Java::NetSfJson::JSONArray:0x69522a14>}, "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"=>#<Java::NetSfJson::JSONArray:0x40030597>}, "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"}}
def json_展平(输入)
客户\u订单\u哈希=hash.new
订单\u数据=input.evaluationTarget
orders_data.keys.每个do| orders_key|
订单_数据[订单_键]。每个do |订单_键_数据|
如果客户订单散列。是否有密钥?(订单密钥数据['cust\u id'])然后
每个\u顺序\u哈希=hash.new
客户订单散列[订单密钥数据['cust\u id']]=每个订单散列
终止
客户订单散列[订单密钥数据['cust\u id']][订单密钥]=订单密钥数据
终止
终止
客户订单散列密钥每个do客户id|
将客户\u订单\u散列[cust\u id]
终止
终止
{“发货地址”=>{“客户id”=>“客户123”,“街道”=>“123大街”,“城市”=>“亚特兰大”,“州”=>“乔治亚州”=>“邮编”=>“12345”},“订单”=>{“客户id”=>“客户123”,“项目”=>,“付款”=>“客户id”=>“客户123”,“类型”=>“签证”,“卡号”=>“1234-1111-2222-3333”,“有效期”=>“2016年6月”;“账单”=>“添加与您的姓氏相同”、“约翰”=>“史密斯”}
{“发货地址”=>{“客户id”=>“客户-456”,“街道”=>“456前街”,“城市”=>“费城”,“州”=>“PA”,“邮编”=>“23456”},“订单”=>{“客户id”=>“客户-456”,“项目”=>,“付款”=>{“客户id”=>“客户-456”,“类型”=>“签证”,“卡号”=>“5678-4444-8877-5544”,“到期”=>“08”=>“添加账单”=>“与第一次发货相同”=>姓氏“=>”琼斯“,”账单地址“=>”{“客户id”=>“客户-456”,“街道”=>“后大街7788号”,“城市”=>“盖恩斯维尔”,“州”=>“佛罗里达州”,“邮编”=>“33444”}
@DavidGrayson我是ruby开发新手。在我的ruby脚本中,我使用JSON模块执行各种JSON操作。JSON.parse(input_JSON_string)正在返回一个散列对象。我最初想循环遍历json中的每个段,并为每个cust_id找到匹配的相应json片段并创建一个新的json。我不确定这样做是否最佳,我想知道是否有任何ruby库/gem可用于实现这一点。
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"=>#<Java::NetSfJson::JSONArray:0x69522a14>}, "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"=>#<Java::NetSfJson::JSONArray:0x40030597>}, "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"}}