2013-03-01 7 views
2

Я пытаюсь преобразовать объект в JSON, а затем снова проанализировать его. Проблема в том, что когда я разбираю строку JSON, у меня остается хэш, а не мой исходный объект. Я нашел этот простой пример на json.rubyforge.com и попробовал:Странное поведение JSON?

require 'json' 

class Range 
    def to_json(*a) 
    { 
     'json_class' => self.class.name, 
     'data'   => [ first, last, exclude_end? ] 
    }.to_json(*a) 
    end 

    def self.json_create(o) 
    new(*o['data']) 
    end 
end 

puts JSON.parse((1..10).to_json) == (1..10) 

Это не удается, а, возвращаясь false. Глядя дальше, не кажется, что вызывается json_create.

На данный момент я полагаю, что мне нужно пропустить что-то мертвое просто или я где-то столкнулся с ошибкой. Я использую Ruby 1.9.3. У кого-нибудь есть идеи?

+0

Я попробовал то же самое в '1.9.3'. 'JSON.parse ((1..10) .to_json) == (1..10)' дает 'true' – codeit

+0

' 2.0.0' версия отлично работает и возвращает true. – mudasobwa

+0

Я также просто запускаю этот код на 1.9.3, и он работает классно. 1) Есть ли в вашем распоряжении какие-либо другие библиотеки? 2) Какая версия рубина? 1.9.3-P385? p392? Были проблемы с безопасностью, связанные с функциями библиотеки json, которые вы используете, поэтому она может быть обновлена ​​и работать несколько иначе, в зависимости от того, какая версия рубина и/или JSON-камень вы установили. –

ответ

6

Это изменение в поведении в p392 обусловлено security fix. Дополнительную информацию см. В разделе p392 release announcement.

Ваш код работает с добавлением :create_additions опции в вызове JSON.parse:

require 'json' 

class Range 
    def to_json(*a) 
    { 
     'json_class' => self.class.name, 
     'data'   => [ first, last, exclude_end? ] 
    }.to_json(*a) 
    end 

    def self.json_create(o) 
    new(*o['data']) 
    end 
end 

puts JSON.parse((1..10).to_json, :create_additions => true) == (1..10) 
+0

Спасибо за информацию Стив! – marcantonio

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