【问题标题】:Ruby on Rails serialize and then deserialize the same object in JSONRuby on Rails 序列化然后反序列化 JSON 中的同一个对象
【发布时间】:2011-05-10 21:48:45
【问题描述】:

我花了几天的时间尝试所有的 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 服务,尽管没有插件时同样的问题仍然存在。

【问题讨论】:

  • 你确定你的 json 是真的 json 吗?就错误而言,它似乎更像是用户对象:(

标签: ruby-on-rails json


【解决方案1】:
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'])

【讨论】:

  • 是的,这应该可以。另一个选项,仅序列化属性:User.first.attributes.to_json。
  • 仅序列化属性有效。 User.new(ActiveSupport::JSON.decode(json)['user']) 没有。 json 存储为字符串,解码后是一个具有空属性的用户对象。
  • User.new(ActiveSupport::JSON.decode(json)['attributes']) 在 Rails 3 中工作。
猜你喜欢
  • 2011-07-05
  • 1970-01-01
  • 2012-01-28
  • 2010-10-11
  • 1970-01-01
  • 2013-08-21
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多