2016-11-15 9 views
0
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\\\"}\""이 인쇄됩니다. 어떤 이유?JSON 형식이 구조 블록에 들어오지 않습니다.

+2

'p' 대신'puts' /'print'를 사용하십시오. – mudasobwa

+0

puts/prints는 "{\"a \ ": \"b \ "}가 아닌 {"a "=>"b "}"{\ "a \"= \ "b \"} ""이면 – Amith

+0

'require "json ' hash = {"a "=>"b "} print hash.to_json'을 실행하면 {"a ":"b "}가 출력됩니다. 내 질문은 이것이 rescue 블록에 전달 될 때 똑같이 출력되지 않는 이유이다. – Amith

답변

3

당신이 구조에서 해시를 가질 수 있도록 항상 문자열로 처리 된 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 정말 안좋아.

+1

왜 JSON.parse가 아닌가요? – mudasobwa

+1

해시의 문자열 표현을 구문 분석 하시겠습니까? –

+1

예, 직접 사용해보십시오 :) – mudasobwa