2015-09-24 17 views
6

Tôi cần phải đổ một đối tượng băm vào JSON và tôi đã tự hỏi cái nào trong số ba, to_json, JSON.generate hoặc JSON.dump, là cách ưu tiên để làm điều đó.Cách ưa thích để đổ một đối tượng JSON là gì? to_json, JSON.generate hoặc JSON.dump?

Tôi đã thử nghiệm các kết quả của các phương pháp này và họ đều giống nhau:

> {a: 1, b: 2}.to_json 
=> "{\"a\":1,\"b\":2}" 
> JSON.generate({a: 1, b: 2}) 
=> "{\"a\":1,\"b\":2}" 
> JSON.dump({a: 1, b: 2}) 
=> "{\"a\":1,\"b\":2}" 

Trả lời

4

Từ docs:

JSON.generate chỉ cho phép các đối tượng hoặc mảng được chuyển đổi sang cú pháp JSON. to_json Tuy nhiên, chấp nhận nhiều lớp của Ruby mặc dù nó hoạt động chỉ như là một phương pháp để serialization

[JSON.dumps] là một phần của việc thực hiện của giao diện tải/bãi chứa của Marshal và YAML.

Nếu anIO (một đối tượng như đối tượng hoặc đối tượng phản hồi phương pháp ghi) được đưa ra, kết quả JSON được ghi vào đó.

+0

Tôi vẫn không tìm thấy bất kỳ sự khác biệt lớn nào giữa 'generate' và' dumps' bên cạnh đối số tệp tùy chọn và giới hạn. Là nó? – linkyndy

+1

Khá nhiều. Như các tài liệu nói, '# dump' là có cho phép bạn làm một cái gì đó như' serializer = [JSON, Marshal, YAML] [rand (3)]; serializer.dump (obj, io, limit) '. (tốt, một điều hữu ích hơn sẽ là để chọn serialiser trong một tập tin cấu hình, ví dụ, nhưng phải mất nhiều không gian hơn so với lựa chọn ngẫu nhiên: P). – Amadan

3

JSON.generate chỉ cho phép các đối tượng hoặc mảng được chuyển đổi sang cú pháp JSON.

to_json chấp nhận nhiều lớp của Ruby mặc dù nó hoạt động chỉ như là một phương pháp để serialization

JSON.generate(1) 
JSON::GeneratorError: only generation of JSON objects or arrays allowed 

1.to_json 
=> "1" 

JSON.dump: Dumps obj như là một chuỗi JSON, gọi điện tạo ra trên đối tượng và trả về kết quả.

Bạn có thể nhận được thông tin nhiều hơn từ here

2

Đối với mảng bán phá giá, băm và đối tượng (được chuyển đổi bởi to_hash), 3 cách này tương đương nhau.

Nhưng JSON.generate hoặc JSON.dump chỉ cho phép mảng, băm và đối tượng.

to_json chấp nhận nhiều lớp của Ruby mặc dù nó hoạt động chỉ như là một phương pháp để serialization, giống như một số nguyên:

JSON.generate 1 # would be allowed 
1.to_json # => "1" 

JSON.generate mất thêm nhiều lựa chọn cho phong cách đầu ra (như không gian, indent)

JSON.dump , kiểu mặc định đầu ra, nhưng lấy một đối tượng giống như IO làm đối số thứ hai để viết, đối số thứ ba dưới dạng số giới hạn của mảng hoặc đối tượng lồng nhau.

Các vấn đề liên quan