JSON

2015-02-04 27 views
6

ile Ruby serialize yapısını yapıyorum JSON için basit bir yapı seri hale getirmeye çalışıyorum, ancak JSON'dan bu yapının bir örneğini oluşturmak için bunu alamıyorum. İşte bunu yapmaya çalışıyorum.JSON

require 'rubygems' 
require 'json' 

Person = Struct.new(:name, :age) 

json = Person.new('Adam', 19).to_json 
puts json 

me = JSON.load(json) 
puts me.name 

Ve şu çıktıyı alıyorum: Bu durumda

"#<struct Person name=\"Adam\", age=19>" 
/usr/lib/ruby/1.9.1/json/common.rb:148:in `parse': 746: unexpected token at '"#<struct Person name=\"Adam\", age=19>"' (JSON::ParserError) 
    from /usr/lib/ruby/1.9.1/json/common.rb:148:in `parse' 
    from /usr/lib/ruby/1.9.1/json/common.rb:309:in `load' 
    from why.rb:9:in `<main>' 

cevap

10

, person.to_json beklediğiniz yapmıyor.

Eğer require 'json' JSON kütüphanesi başka sağlanan hiçbir özel #to_json yöntem söz konusuysa ve bir geri dönüş olduğunu Object üzerinde #to_json yöntem ekler. This inserted method, bir nesnede temel olarak #to_s#to_json numaralı çağrıyla aynıdır. Buraya Person sınıfı olması durumunda

, #to_s varsayılan olarak, JSON kitaplığı tarafından ayrıştırılabilir bir dize sağlamaz, standard Object#to_s, çıkarır.

Ancak Struct bir Hash bu yapı dönüştürmek için kullanılabilecek bir #to_h yöntem temin etmez ve Hash (JSON kütüphane gerektiren bağlı olarak) bir JSON ayrıştırılabilir çıktı oluşturmak için nasıl farkındadır.

Yani basitçe değiştirerek:

json = Person.new('Adam', 19).to_json 
puts json 

için:

person = Person.new('Adam', 19) 
puts person.to_h.to_json 

beklediğiniz yapacağız.

(An kenara, ben aslında doğrudan #to_h#to_json Law of Demeter ihlal çağırarak olarak Person sınıfına #to_json uygulayan öneriyoruz.) Mükemmel çalıştı

+1

teşekkürler. Gelecekte bunu okuyan herkes için, to_h yönteminin ruby ​​2.0'a eklendiğini not etmek isterim, bu yüzden 1.9.3 kullanıyorsanız, yükseltmeliydin. –