代码:
#!/usr/bin/ruby
require 'rubygems'
require 'open-uri'
require 'json'
def getData
file = open("http://goo.gl/BI6h7a")
@json = JSON.parse(file.read)
end
getData
cveIds = @json['cve_id']
puts cveIds
您可以在此处查看JSON响应:http://goo.gl/BI6h7a
控制台:
./cve.rb:13:in `[]': can't convert String into Integer (TypeError) from ./cve.rb:13:in `<main>'
我不知道为什么会这样。 &#34;将字符串转换为整数&#34;?什么呢?
@json
内容正常,但cveIds
没有。
答案 0 :(得分:2)
你正在阅读的json中的top元素实际上是一个Array,它的每个元素实际上都是一个hash,就像这样:
[
{
"cve_id": "CVE-2014-3976"
// other key/value pairs
}
{
"cve_id": "CVE-2014-3975"
// other key/value pairs
}
{
"cve_id": "CVE-2014-3974"
// other key/value pairs
}
// .... more hashes
]
所以@json
是一个数组。如果你想访问它的任何元素,你必须使用数字整数索引来访问它,所以:
@json[0] # => { "cve_id": "CVE-2014-3976", // other key/value pairs }
我认为您正在尝试收集所有这些哈希的cve_id
字段,这可以通过以下方式完成:
cveIds = @json.collect { |h| h["cve_id"] }
# The result:
=> ["CVE-2014-3976", "CVE-2014-3975", "CVE-2014-3974", "CVE-2014-3962", "CVE-2014-3961",
"CVE-2014-3878", "CVE-2014-3871", "CVE-2014-3842", "CVE-2014-3806", "CVE-2014-3792",
"CVE-2014-3791", "CVE-2014-3443", "CVE-2014-3247", "CVE-2014-3246", "CVE-2014-3225",
"CVE-2014-3216", "CVE-2014-3139", "CVE-2014-3138", "CVE-2014-3008", "CVE-2014-2996",
"CVE-2014-2994", "CVE-2014-2976", "CVE-2014-2850", "CVE-2014-2847", "CVE-2014-2671",
"CVE-2014-2668", "CVE-2014-2588", "CVE-2014-2587","CVE-2014-2586", "CVE-2014-2579"]
答案 1 :(得分:1)
我不是ruby
开发人员,但如果有字典,那么你有一个列表。
我的猜测是为了让你阅读cve_id
,你需要创建一种for循环。
例如在python
我会这样写:
for line in my_data:
print line['cve_id']
我猜在红宝石中看起来像这样:
for i in @json do
cveIds = i['cve_id']
puts cveIds
end
答案 2 :(得分:1)
cveIds = @json['cve_id']
你在这做什么相当于:
arr = [1, 2, 3, 4]
puts arr["hello"] # using a string here on an indexed based array!
因此,有关Ruby尝试将String
转换为int
的错误消息。
请尝试以下
cveIds = @json.first['cve_id'] # equivalent to @json[0]['cve_id']
puts cveIds
在上面的代码示例中,我们从数组中获取第一个元素,然后我们可以从中访问cve_id
。