我花了好几天尝试了所有的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服务,尽管在没有插件的情况下仍存在同样的问题。
答案 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'])