2010-08-04 116 views
0

我不是一个红宝石男人,我只是在电视上玩一个。我必须修改某个人的旧Cron作业来拉下一些JSON并将其转换为对象。这个Ruby语句为什么会抛出异常? (Arrays/Bools)

下面的代码

raw_json = Net::HTTP.get(URI.parse("url removed to protect the innocent")) 

tags = ActiveSupport::JSON.decode(raw_json) 

puts tags.count 

tags.count将准确跟踪5,但该行立即导致崩溃如下:

5 #the accurate count! 
rake aborted! 
undefined method `count' for false:FalseClass 

什么dealio?

+0

'p标签'给你什么? – 2010-08-04 13:44:07

+0

准确的数组。但我知道发生了什么事。第一个请求(这是在一个循环上运行),返回一个准确的数组,但第二个循环返回任何内容,因此False ...我怎样才能确保JSON.decode至少给我一个空的集合? – 2010-08-04 14:12:33

+1

tags = ActiveSupport :: JSON.decode(raw_json)|| [] – 2010-08-04 14:26:59

回答

1

raw_json的内容是什么?看起来正在发生的是ActiveSupport::JSON#decode返回false(因此undefined method 'count' for false:FalseClass)。我认为JSON#decode只在给出空字符串时返回false,这意味着HTTP#get正在返回空字符串。检查raw_json,看看它是否包含你所期望的。

+0

但它没有返回false,因为它报告的是准确的收集计数......“False”怎么会返回5?而raw_json绝对正确,并具有我期待的内容。 – 2010-08-04 14:07:54

1

所以我不知道这里发生了什么,但JSON.decode 应该给你一个散列,它没有一个计数方法。它有一个大小的方法虽然

tags.size 

如果不工作,尝试做p标签,或把tags.class.name,试图找出你与

+0

其实tags.size和tags.count都返回正确的数字,5,去图。把tags.class.name打印成“Array” - 所以你有它。 – 2010-08-04 14:09:12

0

显然标签是工作假,这可能意味着你的Net :: HTTP.get失败(我猜你的URL是错误的)。 尝试打印标签以查看它是什么。 (我想无论如何,你应该使用一个有效的URI)

0

的问题是:

>> ActiveSupport::JSON::decode("") 
=> false 
>> ActiveSupport::JSON::decode("false") 
=> false 

这是一个很奇怪的行为。

相关问题