2015-02-23 46 views
0

我希望循環瀏覽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 

是怎麼回事還是我需要做整理我的文件,使他們能夠正確地解析了什麼內容的任何想法?

回答

4

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,因爲方法名以?結尾。

+0

謝謝!最初在dir.exists?()之後,我做了些什麼,但由於某種原因,我改變了這一點。我理解你的想法,而這確實是重複的和不必要的。你所說的json文檔相當糟糕。感謝你的解釋,我是一個小菜鳥,這對我有很大的幫助。 – James 2015-02-24 16:28:24

相關問題