Cách chuyển đổi JSON thành hàm băm Ruby


137

Tôi có một đối tượng JSON giữ giá trị sau:

@value = {"val":"test","val1":"test1","val2":"test2"}

Tôi muốn lặp qua nó trong Ruby để lấy các cặp khóa / giá trị. Khi tôi sử dụng @each, nó không lặp qua đối tượng vì nó không ở dạng băm Ruby:

@value = {"val"=>"test","val1"=>"test1","val2"=>"test2"}

Làm cách nào tôi có thể chuyển đổi đối tượng JSON ở trên thành hàm băm Ruby?

Câu trả lời:


250

Những đoạn sau đây thì sao?

require 'json'
value = '{"val":"test","val1":"test1","val2":"test2"}'
puts JSON.parse(value) # => {"val"=>"test","val1"=>"test1","val2"=>"test2"}

7
value = '{"val":"test","val1":"test1","val2":"test2"}'có thể dễ đọc hơn
luckykrrish

40

Bạn cũng có thể sử dụng with_indifferent_accessphương pháp của Rails để bạn có thể truy cập vào phần thân bằng các ký hiệu hoặc chuỗi.

value = '{"val":"test","val1":"test1","val2":"test2"}'
json = JSON.parse(value).with_indifferent_access

sau đó

json[:val] #=> "test"

json["val"] #=> "test"

Có ai biết nếu điều này là tốn nhiều tài nguyên hơn cho các đối tượng băm lớn hơn? Tôi chưa quen với Ruby / Rails, nhưng giả sử điều này trùng lặp các cặp khóa-giá trị?
Jonathan

4

Giả sử bạn có một hàm băm JSON treo ở đâu đó, để tự động chuyển đổi nó thành một cái gì đó giống như phiên bản của WarHog, hãy bọc nội dung băm JSON của bạn trong %q{hsh}các thẻ.

Điều này dường như tự động thêm tất cả các văn bản thoát cần thiết như trong câu trả lời của WarHog.



1

Tôi ngạc nhiên không ai chỉ ra []phương thức của JSON , điều này giúp cho việc giải mã và mã hóa từ / sang JSON trở nên rất dễ dàng và minh bạch.

Nếu đối tượng giống chuỗi, phân tích chuỗi và trả về kết quả được phân tích cú pháp dưới dạng cấu trúc dữ liệu Ruby. Mặt khác, tạo một văn bản JSON từ đối tượng cấu trúc dữ liệu Ruby và trả về nó.

Xem xét điều này:

require 'json'

hash = {"val":"test","val1":"test1","val2":"test2"} # => {:val=>"test", :val1=>"test1", :val2=>"test2"}
str = JSON[hash] # => "{\"val\":\"test\",\"val1\":\"test1\",\"val2\":\"test2\"}"

strhiện chứa mã hóa JSON hash.

Thật dễ dàng để đảo ngược nó bằng cách sử dụng:

JSON[str] # => {"val"=>"test", "val1"=>"test1", "val2"=>"test2"}

Các đối tượng tùy chỉnh cần to_sđược xác định cho lớp và bên trong nó chuyển đổi đối tượng thành Hash sau đó sử dụng to_jsonnó.


0

Bạn có thể sử dụng đá quý Nice_hash: https://github.com/MarioRuiz/nice_hash

require 'nice_hash'
my_string = '{"val":"test","val1":"test1","val2":"test2"}'

# on my_hash will have the json as a hash, even when nested with arrays
my_hash = my_string.json

# you can filter and get what you want even when nested with arrays
vals = my_string.json(:val1, :val2)

# even you can access the keys like this:
puts my_hash._val1
puts my_hash.val1
puts my_hash[:val1]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.