奇怪的JSON行为?

问题描述:

我想将对象转换为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 2013-03-01 18:05:50

+0

'2.0.0'版本正常返回'true'。 – mudasobwa 2013-03-01 18:21:44

+0

我也只是在1.9.3上运行这个代码,它是着名的。 1)您是否还有其他图书馆? 2)究竟是什么版本的红宝石? 1.9.3-P385? P392?您正在使用的json库的功能存在安全问题,因此它可能已被更新并且工作方式略有不同,具体取决于您安装的是哪个版本的Ruby和/或JSON gem。 – 2013-03-01 18:21:45

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 2013-03-01 21:28:35