2012-01-29 41 views
46

我可以用從json到紅寶石哈希?

require 'json' 

def saveUserLib(user_lib) 
    File.open("/Users/name/Documents/user_lib.json","w") do |f| 
    f.write($user_lib.to_json) 
    end 
end 

uname = gets.chomp 
$user_lib["_uname"] = uname 
saveUserLib($user_lib) 

一條路可走,但我怎麼找回來再次爲我的user_lib?

+3

小代碼批評:你不應該將文件路徑硬編碼到你的方法中。你應該讓你的方法接受一個文件路徑,或者把一個常量放在你的文件的頂部並且使用路徑。經驗法則(總是有例外):如果您在方法中硬編碼一個數字(除1以外)或面向用戶的字符串,則會使代碼變得更加脆弱並且難以維護。 – Phrogz 2012-01-29 17:57:17

+0

當我刪除我的'''''我得到以下錯誤:'

':未定義的局部變量或方法'user_lib'爲主:對象(NameError) – beoliver 2012-01-29 18:07:58

+1

但關於路徑 - 我知道 - 但它是快速測試!謝謝你的擡頭雖然 – beoliver 2012-01-29 18:10:17

回答

96

你想JSON.parseJSON.load

def load_user_lib(filename) 
    JSON.parse(IO.read(filename)) 
end 

這裏的關鍵是使用IO.read作爲一個簡單的方法來從磁盤加載JSON字符串,使其可以被解析。或者,如果你在你的文件UTF-8的數據:

my_object = JSON.parse(IO.read(filename, encoding:'utf-8')) 

我已經連接到上面的JSON文件,所以你應該去閱讀了解更多詳情。但總結:

  • json = my_object.to_json - 與特定對象的方法來創建一個JSON字符串。
  • json = JSON.generate(my_object) - 從對象創建JSON字符串。
  • JSON.dump(my_object, someIO) - 創建JSON字符串並寫入文件。
  • my_object = JSON.parse(json) - 從JSON字符串創建一個Ruby對象。
  • my_object = JSON.load(someIO) - 從文件創建一個Ruby對象。

或者:

def load_user_lib(filename) 
    File.open(filename, "r") do |f| 
    JSON.load(f) 
    end 
end 

注:我已經對應於你的 「駝峯」 saveUserLib,因爲這是Ruby約定的方法使用的 「snake_case」 的名字。

+0

'JSON.dump有什麼區別? '/'.to_json' /'JSON.generate'然後'JSON.parse' /'JSON.load'? – beoliver 2012-01-29 17:35:49

+0

@ user969617我編輯了我的答案以顯示差異,並總結了處理JSON數據的方式。 – Phrogz 2012-01-29 17:48:17

+0

'JSON.parse'和'JSON.load'都可以「從JSON字符串創建一個Ruby對象」 – pje 2012-08-30 13:17:18

2

這裏是一些例子:

require 'json' 

source_hash = {s: 12, f: 43} 
json_string = JSON.generate source_hash 
back_to_hash = JSON.parse json_string 
+1

不正確! 'JSON.parse'結果是'{「s」=> 12,「f」=> 43}'不是'{s:12,f:43}' – 2012-11-17 14:40:37

2

JSON.load會做的伎倆。下面是是雙向的一個例子:

>> require 'json' 
=> true 
>> a = {"1" => "2"} 
=> {"1"=>"2"} 
>> b = JSON.dump(a) 
=> "{\"1\":\"2\"}" 
>> c = JSON.load(b) 
=> {"1"=>"2"}