2012-06-27 7 views
3

Я создал следующий классНевозможно разобрать JSON с рубином

class Contact 
    def initialize(id, name, phone) 
     @id = id 
     @name = name 
     @phone = phone 
    end 

    def to_json(*a) 
     { 
     json_class: self.class.name, 
     data: { id: @id, name: @name, phone: @phone } 
     }.to_json(*a) 
    end 

    def self.json_create(o) 
     new(o[:data][:id], o[:data][:name], o[:data][:phone]) 
    end 
    end 

теперь я могу преобразовать его в формат JSON с помощью этого

Contact.new(1,'nik',10).to_json 
=> "{\"json_class\":\"Contact\",\"data\":{\"id\":1,\"name\":\"nik\",\"phone\":10}}" 

Но она взрывается с ошибкой, когда я звоню JSON.parse на Это.

JSON.parse(Contact.new(1,'nik',10).to_json) 
NoMethodError: undefined method `[]' for nil:NilClass 
    from (irb):44:in `json_create' 

Я взял синтаксис из this учебник.

ответ

3

Избавьтесь от символов в вашем методе json_create.

def self.json_create(o) 
    new(o['data']['id'], o['data']['name'], o['data']['phone']) 
end 
+0

Это было трюк, не могли бы вы сказать мне, почему я сделал это неправильно, у меня создалось впечатление, что символы и строки могут использоваться взаимозаменяемо, а символы имеют лучшую производительность. – nikhil

+1

Символы и строки - разные объекты. Символы всегда относятся к одному и тому же объекту, тогда как строки являются новыми объектами каждый раз, когда они ссылаются (если они не сохранены в переменной). –

+1

Что сказал @ AndréSantosdeMedeiros правильно. Поведение, о котором вы думаете, - это нечто, что связано с Rails, которое предоставляет [HashWithIndifferentAccess] (http://as.rubyonrails.org/classes/HashWithIndifferentAccess.html), который позволяет использовать либо символ, либо строчную форму ключа для доступ к значению. –

0

Использовать as_json вместо to_json.

Смежные вопросы