简单的JSON在Ruby中不起作用

时间:2014-06-12 00:07:00

标签: ruby json

代码:

#!/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没有。

3 个答案:

答案 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