Формат JSON не входит в блок восстановления - ruby

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\\\"}\"". Любая причина?


person Amith    schedule 15.11.2016    source источник
comment
Используйте puts/print вместо p.   -  person Aleksei Matiushkin    schedule 15.11.2016
comment
ставит / печатает дает {a=›b}{\a\=›\b\}, а не {\a\:\b\}   -  person Amith    schedule 15.11.2016
comment
если вы выполните require 'json' hash = {"a" => "b"} print hash.to_json, то он напечатает {a:b}. Мой вопрос в том, почему он не печатает то же самое, когда это передается в спасательный блок   -  person Amith    schedule 15.11.2016
comment
Поскольку это уже не Hash, это экземпляр String, raise преобразует свой второй аргумент в строку.   -  person Aleksei Matiushkin    schedule 15.11.2016


Ответы (1)


Второй аргумент метода 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 Это действительно очень плохо.

person Зелёный    schedule 15.11.2016
comment
Почему не JSON.parse? - person Aleksei Matiushkin; 15.11.2016
comment
разобрать строковое представление хеша? - person Зелёный; 15.11.2016
comment
Да ты сам попробуй :) - person Aleksei Matiushkin; 15.11.2016
comment
@mudasobwa конечно, почему бы и нет? require 'json';JSON.parse(%Q|{"a"=>"b"}|) Вы, должно быть, шутите... - person Зелёный; 15.11.2016