2012-01-29 34 views
46

tôi có thể đi một cách sử dụngtừ json đến băm ruby?

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) 

nhưng làm thế nào để tôi lấy lại một lần nữa như user_lib của tôi?

+3

Phê bình mã nhỏ: bạn không nên mã hóa đường dẫn tệp vào phương thức của mình. Bạn nên hoặc có phương pháp của bạn chấp nhận một đường dẫn tập tin, hoặc đặt một hằng số ở đầu tệp của bạn với đường dẫn để sử dụng. Quy tắc ngón tay cái (luôn có ngoại lệ): nếu bạn đã từng mã hóa một số (có lẽ là 1) hoặc chuỗi người dùng phải đối mặt bên trong một phương pháp, bạn đang làm cho mã của bạn trở nên mong manh và khó bảo trì hơn. – Phrogz

+0

khi tôi xóa '$' 'của mình, tôi nhận được lỗi sau: '

': biến cục bộ hoặc phương thức' user_lib 'cho chính: Object (NameError) – beoliver

+1

nhưng về đường dẫn - điều này tôi biết - nhưng nó là dành cho một bài kiểm tra nhanh! cảm ơn cho những người đứng đầu mặc dù – beoliver

Trả lời

96

Bạn muốn JSON.parse hoặc JSON.load:

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

Mấu chốt ở đây là sử dụng IO.read như là một cách đơn giản để nạp chuỗi JSON từ đĩa, do đó nó có thể được phân tích cú pháp. Hoặc, nếu bạn có dữ liệu UTF-8 trong tệp của mình:

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

Tôi đã liên kết với tài liệu JSON ở trên, vì vậy bạn nên đọc để biết thêm chi tiết. Nhưng tóm lại:

  • json = my_object.to_json - phương pháp trên đối tượng cụ thể để tạo chuỗi JSON.
  • json = JSON.generate(my_object) - tạo chuỗi JSON từ đối tượng.
  • JSON.dump(my_object, someIO) - tạo chuỗi JSON và ghi vào một tệp.
  • my_object = JSON.parse(json) - tạo đối tượng Ruby từ chuỗi JSON.
  • my_object = JSON.load(someIO) - tạo đối tượng Ruby từ tệp.

Hoặc:

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

Lưu ý: Tôi đã sử dụng một "snake_case" tên cho phương pháp tương ứng với "camelCase" của bạn saveUserLib vì đây là ước Ruby.

+0

sự khác nhau giữa' JSON.dump là gì '/' .to_json'/'JSON.generate' và sau đó là' JSON.parse'/'JSON.load'? – beoliver

+0

@ user969617 Tôi đã chỉnh sửa câu trả lời của mình để hiển thị sự khác biệt và tóm tắt các cách xử lý dữ liệu JSON. – Phrogz

+0

Cả hai 'JSON.parse' và' JSON.load' có thể "tạo một đối tượng Ruby từ một chuỗi JSON" – pje

2

đây là một số ví dụ:

require 'json' 

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

Không đúng sự thật! Kết quả 'JSON.parse' có dạng chuỗi là' {"s" => 12, "f" => 43} 'không' {s: 12, f: 43} ' –

2

JSON.load sẽ làm các trick. Dưới đây là một ví dụ mà đi cả hai cách:

>> require 'json' 
=> true 
>> a = {"1" => "2"} 
=> {"1"=>"2"} 
>> b = JSON.dump(a) 
=> "{\"1\":\"2\"}" 
>> c = JSON.load(b) 
=> {"1"=>"2"} 
Các vấn đề liên quan