require 'json'
begin
hash = {"a" => "b"}
raise StandardError, hash
rescue Exception => e
q = e.message
p q
p q.to_json
end
он должен печатать "{\"a\":\"b\"}"
, но печатает "\"{\\\"a\\\"=>\\\"b\\\"}\""
. Любая причина?
require 'json'
begin
hash = {"a" => "b"}
raise StandardError, hash
rescue Exception => e
q = e.message
p q
p q.to_json
end
он должен печатать "{\"a\":\"b\"}"
, но печатает "\"{\\\"a\\\"=>\\\"b\\\"}\""
. Любая причина?
Второй аргумент метода raise
всегда обрабатывается как строка, поэтому у вас не может быть хэша из спасения, вы можете преобразовать его в json и обратно
require 'json'
begin
hash = {"a" => "b"}
raise StandardError, hash.to_json # to string
rescue Exception => e
q = JSON.parse(e.message) # from string
p q.to_json
end
=> "{\"a\":\"b\"}"
Я тоже знаю злой путь с eval
:
require 'json'
begin
hash = {"a" => "b"}
raise StandardError, hash
rescue Exception => e
q = eval(e.message)
p q.to_json
end
=> "{\"a\":\"b\"}"
Но это нехорошо. Использование eval
Это действительно очень плохо.
JSON.parse
?
- person Aleksei Matiushkin; 15.11.2016
require 'json';JSON.parse(%Q|{"a"=>"b"}|)
Вы, должно быть, шутите...
- person Зелёный; 15.11.2016
puts
/print
вместоp
. - person Aleksei Matiushkin   schedule 15.11.2016require 'json' hash = {"a" => "b"} print hash.to_json
, то он напечатает {a:b}. Мой вопрос в том, почему он не печатает то же самое, когда это передается в спасательный блок - person Amith   schedule 15.11.2016Hash
, это экземплярString
,raise
преобразует свой второй аргумент в строку. - person Aleksei Matiushkin   schedule 15.11.2016