1

Ruby 1.9.3-p392在 CentOS 6.4 上使用 RVM解析 JSON 时遇到了一个奇怪的问题。它不是将嵌入的对象解码为相应的 Ruby 类,而是将对象作为散列加载。在Ruby 1.9.3-p194它工作正常。

采取以下示例:

require 'json'

class TestMe
    attr_accessor :me
    def initialize(option_hash = nil)
        if option_hash
            @me = option_hash['me']
        end
        @me ||= "Hello"
    end

    def to_json(*a)
        {
            JSON.create_id => self.class.name,
            'data' => {
                "me" => @me
            }
        }.to_json(*a)
    end

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

t = TestMe.new
t.me = "foo"
t2 = JSON.parse(t.to_json)
puts t2

如果我在 上运行它Ruby 1.9.3-p194,它会输出以下内容:

#<TestMe:0x00000001c877f0>

如果我在 上运行相同的代码段Ruby 1.9.3-p392,它会输出以下内容:

{"json_class"=>"TestMe", "data"=>{"me"=>"foo"}}

中的行为p194是我所期望的,也是文档所暗示的。为什么无法p392正确解析 JSON 数据?

4

3 回答 3

1

正如其他人所说,这听起来像是最近对 JSON 对象解组方式的改变。我在这里遇到了一个非常相似的问题并得到了很好的答案。

于 2013-05-01T19:18:29.710 回答
1

仍然不确定为什么/发生了什么变化,但我找到了解决方法。基本上,您需要构造一个Parser对象并传入:create_additions选项,而不仅仅是调用JSON.parse.

例子:

p = JSON::Parser.new(json_string, {:create_additions => true})
result = p.parse
于 2013-05-01T19:14:04.823 回答
0

JSON 本身将返回一个哈希值。它有一个扩展,赋予它额外的功能。尝试使用:

require 'json'
require 'json/add/core'

我认为在过去的某一时刻,Ruby JSON 会自动加载扩展,但为了与 JSON 规范相比较而放弃了。

“add/core”包括一些to_json基础对象的方法,并可能添加恢复自定义对象的能力。我遇到了通过 JSON 传递正则表达式的类似情况,这就是解决方法。

我不在我的电脑附近,因此无法确认,但这可能会有所帮助。

于 2013-05-01T01:42:31.217 回答