【问题标题】:How to separate keys and values in JSON result如何在 JSON 结果中分离键和值
【发布时间】:2018-12-26 10:45:16
【问题描述】:

当我调用国家/地区列表时,我从 API 获得以下 JSON 数组:

{
"countries": [
    [
        "Andorra",
        "AD"
    ],
    [
        "United Arab Emirates",
        "AE"
    ],
    [
        "Afghanistan",
        "AF"
    ],
    [
        "Antigua and Barbuda",
        "AG"
    ],
    [
        "Anguilla",
        "AI"
    ],
    [
        "Albania",
        "AL"
    ],
    [
        "Armenia",
        "AM"
]]}

这是我的控制器:

def find_countries
    @countries =  CountryStateSelect.countries_collection
    render :json=>{ :countries=> @countries }
  end

我想像这样分隔这个国家列表数组。

{
    "countries": [
        [
            value:"Andorra",
            key: "AD"
        ],
        [
           value: "United Arab Emirates",
            key:"AE"
        ],
        [
           value: "Afghanistan",
            key:"AF"
        ],
        [
            value:"Antigua and Barbuda",
            key:"AG"
        ]
        ]}

我无法识别值和键。我怎样才能像上面那样分离这个 JSON 响应?

【问题讨论】:

    标签: ruby-on-rails json ruby


    【解决方案1】:

    您需要将每个项目映射到一个对象中

    @countries =  CountryStateSelect.countries_collection.map do |name, code|
      Hash[:key, code, :value, name]
    end
    

    【讨论】:

      【解决方案2】:

      只需将您的数组转换为哈希:

      h = _ # your input data given
      
      h[:countries].map!{|a| {value: a[0], key: a[1]} }
      

      【讨论】:

        【解决方案3】:
        input = {
          "countries": [
            ["Andorra", "AD"],
            ["United Arab Emirates", "AE"]        
          ]
        } 
        
        input.
          transform_values do |vals|
            vals.map(&%i[value key].method(:zip)).map(&:to_h)
          end
        
        #⇒ {
        #   :countries => [
        #     [0] {
        #         :key => "AD",
        #       :value => "Andorra"
        #     },
        #     [1] {
        #         :key => "AE",
        #       :value => "United Arab Emirates"
        #     }
        #   ]
        # }
        

        【讨论】:

        • 为什么我们需要 2 次调用来映射这种情况?
        【解决方案4】:

        使用收集方法:

        countries = CountryStateSelect.countries_collection.collect do |country, code|
            { key: code, value: country }
        end
        

        【讨论】:

          猜你喜欢
          • 2021-12-02
          • 2013-02-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-29
          • 1970-01-01
          • 1970-01-01
          • 2017-11-11
          相关资源
          最近更新 更多