JSON没有在Ruby中将String隐式转换为Integer

时间:2017-01-26 15:11:31

标签: ruby-on-rails json ruby

我从我的服务器抓取一个JSON哈希并尝试在我的ruby脚本中读取它。它似乎回到了错误的价值,除非我只是在忘记我的想法:

我是从一个函数中调用它的:

def get_functions(serial_number)
  response = HTTParty.get("#{get_host_url}/v1/devices/#{serial_number}.json")
  data = response['scan_option']
  return data
end

这是返回的JSON:

{"can_scan"=>true, "can_brute_ssh"=>false, "can_brute_telnet"=>false, "can_brute_voip"=>false, "can_brute_smtp"=>false, "can_brute_pop3"=>false, "can_google_crawl"=>false, "can_scan_external_ip"=>false, "scan_ip_list"=>["10.10.10.1"], "exclude_ip_list"=>[]}

然后将其读入以下代码:

data.each do |d|
  @can_scan = d['can_scan']
  # ....
end

但是这会引发错误:

  

没有将String隐式转换为整数

2 个答案:

答案 0 :(得分:1)

{foo: :bar}.each do |d|
  p d
  d['meow']
end
  # => [:foo, :bar]
  #! TypeError: no implicit conversion of String into Integer

Hash#each产生一个两元素数组([key, value])。然后尝试使用d["can_scan"]索引该数组,该数组失败,因为数组只能用整数索引。

而是直接访问值 - data['can_scan']

答案 1 :(得分:1)

我的意思是你的第三个片段(你称之为data)中的data.each是上面提到的哈希,实际上这很麻烦。在哈希上调用each将对其键值对进行迭代,在d的块data.each中为其提供一个数组(其中包含[key, value]对) 。

您可能只想致电data['can_scan']

请注意,Ruby中不需要方法防御结束时的return。你可以这样做:

def get_functions(serial_number) response = HTTParty.get("#{get_host_url}/v1/devices/#{serial_number}.json") response["scan_option"] end