Tôi có chuỗi này và tôi tự hỏi làm thế nào để chuyển đổi nó thành một Hash.Làm thế nào để phân tích một chuỗi đại diện của một băm
"{:account_id=>4444, :deposit_id=>3333}"
Tôi có chuỗi này và tôi tự hỏi làm thế nào để chuyển đổi nó thành một Hash.Làm thế nào để phân tích một chuỗi đại diện của một băm
"{:account_id=>4444, :deposit_id=>3333}"
Guess Tôi chưa bao giờ đăng tải workaround của tôi cho điều này ... Ở đây nó đi,
# strip the hash down
stringy_hash = "account_id=>4444, deposit_id=>3333"
# turn string into hash
Hash[stringy_hash.split(",").collect{|x| x.strip.split("=>")}]
Điều này sẽ không chia tách các trường một cách chính xác nếu bạn có bất kỳ dữ liệu nào chứa một ',' hoặc '=>'. '{: text =>" Chào mừng, bạn bè. ", delim =>" => "}' – Matt
Các dễ nhất và unsafest sẽ chỉ đánh giá chuỗi:
>> s = "{:account_id=>4444, :deposit_id=>3333}"
>> h = eval(s)
=> {:account_id=>4444, :deposit_id=>3333}
>> h.class
=> Hash
Tôi nhận được các thông số này trong đường ray. Không có cách nào an toàn để chuyển đổi chuỗi thành băm khác với eval. – zoras
Tôi không biết thiết lập của bạn, nhưng có lẽ sẽ dễ dàng hơn khi lấy lại một băm ngay từ đầu. Nếu không, ruby hỗ trợ một số mức TAINT, xem: http://www.ruby-doc.org/docs/ProgrammingRuby/html/taint.html – miku
Cách gợi ý trong câu trả lời của miku thực sự là đơn giản nhất và unsafest.
# DO NOT RUN IT
eval '{:surprise => "#{system \"rm -rf/\"}"}'
# SERIOUSLY, DON'T
Cân nhắc việc sử dụng biểu diễn chuỗi khác nhau của băm, ví dụ: JSON hoặc YAML. Đó là cách an toàn hơn và ít nhất là mạnh mẽ như nhau.
Với một sự thay thế chút, bạn có thể sử dụng YAML:
require 'yaml'
p YAML.load(
"{:account_id=>4444, :deposit_id=>3333}".gsub(/=>/, ': ')
)
Nhưng công trình này chỉ dành cho, chuỗi đơn giản cụ thể này. Tùy thuộc vào dữ liệu thực của bạn, bạn có thể gặp vấn đề.
nếu chuỗi hash của bạn là một số loại như thế này (nó có thể được lồng vào nhau hoặc băm đơn giản)
stringify_hash = "{'account_id'=>4444, 'deposit_id'=>3333, 'nested_key'=>{'key1' => val1, 'key2' => val2}}"
bạn có thể chuyển đổi nó sang băm như thế này mà không sử dụng eval đó là nguy hiểm
desired_hash = JSON.parse(stringify_hash.gsub("'",'"').gsub('=>',':'))
và cho người mình gửi w đây chính là một biểu tượng, bạn có thể sử dụng như thế này
JSON.parse(string_hash.gsub(':','"').gsub('=>','":'))
Hashes chứa 'null' cho các đối tượng null, ở đây nó chứa 'nil', do đó cần phải được thay thế. –
thử điều này: http://stackoverflow.com/questions/1667630/how-do-i-convert-a-string-object- into-a-hash-object – yek