2014-05-05 86 views
1

解析定製的Ruby結構得到了繼承結構及其行爲的實體。它實例是這樣的:我如何從JSON

Entity.new(id: 'asdf', name: 'bill', hair: 'brown')

當我要挾結構爲JSON,它loks這樣的:

#<struct Entity id=\"asdf\", name=\"bill\", hair=\"brown\">"

編輯:^^忽略這一點。我試圖讓事情變得模糊,但這裏是從我的IRB會議上直複製/粘貼:

"\"#<struct SorrisoEntity::EmailMessage recipient_email=nil, sender_email=\\\"[email protected]\\\", subject_line=nil, body=nil>\""

當我把它強制到JSON,它不會引發錯誤。但是,當我嘗試了「JSON.parse」呼,我得到這個錯誤:

JSON::ParserError: 757: unexpected token at '"#<struct Entity id=\"asdf\", name=\"bill\", hair=\"brown\">"

爲什麼紅寶石不會馬歇爾自定義結構是否正確?

+0

這不是JSON。你是如何轉換的? –

+0

它看起來像'to_s'不JSON – zishe

+0

確定。只是彈出了真正的輸出結果,而不是我最初提供的更一般的代碼。 –

回答

2

這是沒有記錄,但我閱讀紅寶石源代碼json及其測試得到這一點,你需要手動require 'json/add/struct'和傳遞參數:create_additions => true得到這個工作,如下圖所示:

Entity = Struct.new('Entity', :id, :name, :hair) 
entity = Entity.new("asdf", "bill", "brown") 
# => #<struct Struct::Entity id={"id"=>"asdf", "name"=>"bill", "hair"=>"brown"}, name=nil, hair=nil> 
require 'json/add/struct' 
entity.to_json 
# => "{\"json_class\":\"Struct::Entity\",\"v\":[\"asdf\",\"bill\",\"brown\"]}" 
new_entity = JSON.parse(entity.to_json, :create_additions => true) 
# => #<struct Struct::Entity id="asdf", name="bill", hair="brown"> 
new_entity.name 
# => "bill"