Ruby on Rails序列化然后反序列化JSON中的同一对象

时间:2010-11-16 15:51:52

标签: ruby-on-rails json

我花了好几天尝试了所有的JSON库,包括JSON gem,Yajl-ruby,ActiveSupport :: JSON,没有什么可以做这个简单的任务:

user = User.find(1)
json = user.to_json
user2 = json.as_json # OR json.from_json 
                     # OR JSON.parse(json) 
                     # OR Yajl::Parser.parse(json)
                     # OR ActiveSupport::JSON.decode(json)

当我尝试使用反序列化的JSON数据创建新用户时,我收到以下错误之一:

User.new(Yajl::Parser.parse(json))  
# ActiveRecord::UnknownAttributeError: unknown attribute: json_class

User.new(json.as_json)
# NoMethodError: undefined method `stringify_keys!' for #<String:0xb6de4318>

User.new(JSON.parse(json))
# NoMethodError: undefined method `stringify_keys!' for #<User:0xb6dc7470>

User.new(ActiveSupport::JSON.decode(json))
# NoMethodError: undefined method `stringify_keys!' for #<User:0xb6da3764>

使用to_yaml和from_yaml可以很容易地使用YAML。为什么to_json不能生成from_json可以转换回ruby对象的那种JSON?

编辑:我使用的是Rails 2.3.8,虽然我已经尝试过2.3.5和3.0.0。另外,我使用json-rpc插件来创建JSON-RPC服务,尽管在没有插件的情况下仍存在同样的问题。

1 个答案:

答案 0 :(得分:4)

json = Episode.first.to_json
dec = ActiveSupport::JSON.decode json
Episode.new dec['episode']

在Rails 3.0.1中为我工作。在您的示例中,在将JSON转换回Ruby之后,您没有从包装器dict中取出实际属性dict。你应该试试

User.new(ActiveSupport::JSON.decode(json)['user'])