【问题标题】:Best way to produce a flattened JSON (denormalize) out of hierarchical JSON in Ruby在 Ruby 中从分层 JSON 中生成扁平化 JSON(非规范化)的最佳方法
【发布时间】:2015-01-09 23:59:06
【问题描述】:

我正在努力实现以下目标。我的输入 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 扁平化为两个单独的 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"
      }
   }
}

{
   "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 映射)?

【问题讨论】:

  • @DavidGrayson 我是 ruby​​ 开发的新手。在我的 ruby​​ 脚本中,我使用 JSON 模块来执行各种 JSON 操作。 JSON.parse(input_json_string) 正在返回一个哈希对象。我最初考虑循环遍历 json 中的每个段,并为每个 cust_id 找到匹配的相应 json 片段并创建一个新的 json。我不确定这样做是否是最佳的,并且想知道是否有任何 ruby​​ 库/宝石可以用来实现这一点。

标签: ruby json


【解决方案1】:

这是我目前的解决方案

注意:我的输入是来自 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"}}

【讨论】:

    猜你喜欢
    • 2010-11-30
    • 2020-08-26
    • 2019-12-27
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多