2012-01-29 127 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"}