【问题标题】:How do I use symbols to access a JSON response with HTTParty?如何使用符号通过 HTTParty 访问 JSON 响应?
【发布时间】:2018-01-26 08:45:50
【问题描述】:

我正在使用 HTTPparty gem 在我的 rails 应用程序中发送请求。这是一个例子:

order = HTTParty.get("https://sandbox.moip.com.br/v2/payments/#{o.payment_id}",
                headers: {"Authorization" => "Basic #{encode_auth_token}"})

order_status = JSON.parse(order.body)

变量 order 接收一个 json 作为响应。我已经设法检索到我需要的信息,但我想使用符号而不是字符串来访问 json 数据。

有没有办法使用符号访问我的 json 数据?例如:

order_status[:link]

【问题讨论】:

    标签: ruby-on-rails json ruby hash https


    【解决方案1】:

    剧透警告:最佳选择是#3


    选项 1:您可以在 Hash 上调用 .with_indifferent_access,以便能够使用 'link':link 访问值:

    {'a' => 1}[:a]
    # => nil
    {'a' => 1}.with_indifferent_access[:a]
    # => 1
    {'a' => 1}.with_indifferent_access['a']
    # => 1
    

    选项 2: 在散列上调用 .symbolize_keys(或 .deep_symbolize_keys,如果您也想符号化嵌套键)以将所有键转换为符号:

    hash = { 'name' => 'Rob', 'address' => { 'postal_code' => '92210' } }
    hash.symbolize_keys
    # => {:name=>"Rob", :address=>{'postal_code'=>'92210'}}
    hash.deep_symbolize_keys
    # => {:name=>"Rob", :address=>{:postal_code=>'92210'}}
    

    选项 3: 解析 JSON,并将 symbolize_names 选项设置为 true

    JSON.parse(string, symbolize_names: true)
    

    【讨论】:

      【解决方案2】:

      通过更深入的搜索,我找到了一种更简洁的方法来解决这个问题,使用 .symbolize_keys!,例如:

      order_status = JSON.parse(order.body).symbolize_keys![:status]
      

      更多参考:https://apidock.com/rails/Hash/symbolize_keys%21

      破坏性地将所有键转换为符号,只要它们响应 to_sym。与 symbolize_keys 相同,但会修改 self。

      【讨论】:

      • 其实JSON.parse接受一个选项参数symbolize_names: true
      • 使用这个参数的效果和symbolize_keys一样! ?
      • 我明白了,哈哈。谢谢你的提示。我会尝试重构它。
      • 几乎是一样的效果,但不完全是....尝试使用"{\"hello\":\"there\",\"names\":[{\"name\":\"First\"},{\"name\":\"Second\"}]}"...使用JSON.parse(string, symbolize_keys: true)"name" 键是符号...仅使用Hash#symbolize_keys "hello""names" 键是一个符号...但也有 Hash#deep_symbolize_keys 将转换 "name" 键。
      • so... symbolize_keys 仅在顶级键(不是嵌套键)中执行其工作,但 with_indifferent_access 为嵌套键执行此操作(例如:{ 'a' => { 'b' => 3 } }.with_indifferent_access[:a][:b] return @987654337 @)。期待意外!
      猜你喜欢
      • 2014-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 2016-04-07
      相关资源
      最近更新 更多