2014-05-05 4 views
1

J'ai une entité qui hérite de son comportement de Struct. Il instancie comme ceci:Comment analyser une structure Ruby personnalisée à partir de JSON

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

Quand je l'COERCE struct à JSON, il loks comme ceci:

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

EDIT: ^^ ignorer. Je tentais de garder les choses vagues, mais voici un copier/coller directement de ma session irb:

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

Quand je COERCE à JSON, il ne jette pas une erreur. Mais lorsque je tente d'un appel « JSON.parse », je reçois cette erreur:

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

Pourquoi Ruby ne sera pas marshall la coutume struct appropriée?

+0

Ce n'est pas JSON. Comment essayez-vous de convertir? –

+0

Il semble que 'to_s' ne soit pas JSON – zishe

+0

OK. Juste surgi dans la vraie sortie au lieu du code plus général que j'avais fourni à l'origine. –

Répondre

2

Ce n'est pas documenté, mais je devais lire le code source de rubis pour json et son test pour obtenir cela, vous devez manuellement require 'json/add/struct' et passer les arguments :create_additions => true pour obtenir ce travail, comme indiqué ci-dessous:

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" 
Questions connexes