没有将文件隐式转换为字符串
问题描述:
我希望循环浏览json文件的目录并将它们转换为ruby哈希。我的文件looper函数成功抓取每个文件,并且这些文件的格式是正确的。这里是我的代码:没有将文件隐式转换为字符串
def self.update_server
if Dir.exist?("log/order_errors") == true
logger.debug "#{Dir.entries("log/order_errors")}"
Dir.foreach("log/order_errors") { |f|
logger.debug "Retrieved #{f}"
File.open(f, "r") { |current_file|
JSON.parse(current_file)
}
}
else
logger.error "Was unable to find the directory specified."
end
end
是怎么回事还是我需要做整理我的文件,使他们能够正确地解析了什么内容的任何想法?
答
JSON.parse()
需要一个字符串作为参数 - 不是一个文件:
require 'json'
File.open('data.json') do |f|
JSON.parse(f)
end
--output:--
...no implicit conversion of File into String (TypeError)...
这是为了做到这一点:
require 'json'
File.open('data.json') do |f|
hash = JSON.parse(f.read) #***HERE***
p hash
end
--output:--
{"x"=>1, "y"=>2}
json模块的文档是可怕的,而不幸的是典型的红宝石。文档说parse()的参数是JSON document
,这听起来更像是一个文件而不是字符串。文档应该说的是参数需要是json格式的字符串。
顺便说一句,在这一行:
if Dir.exist?("log/order_errors") == true
...的存在()方法调用是由它的返回值替换,所以如果目录存在红宝石将那条线转换为:
if true == true
然后Ruby有做对比true == true
和Ruby替换的比较结果的比较,即true
产生这样的:
,如果你写了这个,而不是:
if Dir.exist?("log/order_errors")
再次,存在()方法调用是由它的返回值替换,如果目录存在,你会得到这样的:?
?if true
如果该目录不存在,则存在()方法调用由false
取代,制造该:
if false
因此,在存在?()方法调用后编写== true
既浪费时间进行输入,又浪费处理时间,因为它需要ruby进行额外的比较。如上所示,您可以在不进行比较的情况下得到相同的结果。规则是:如果一个方法返回true或false,那么在它之后不需要写== true
。在ruby中,通常很容易判断方法返回true或false,因为方法名以?
结尾。
谢谢!最初在dir.exists?()之后,我做了些什么,但由于某种原因,我改变了这一点。我理解你的想法,而这确实是重复的和不必要的。你所说的json文档相当糟糕。感谢你的解释,我是一个小菜鸟,这对我有很大的帮助。 – James 2015-02-24 16:28:24