在红宝石中:
class Obj
attr_accessor :price
end
my_ruby_obj = Obj.new
put my_ruby_obj.to_json
"\"#<Obj:0x1c9b018>\""
服务器将my_ruby_obj.to_json发送到浏览器(sinatra,带有content_type:json)以响应jquery ajax请求(使用$ .get),该请求正确定义了json的返回类型,并启动执行以下操作的回调函数(数据):
console.log(data);
返回:
#<Obj:0x1c9b018>
现在如何在javascript / jquery 中访问“data.price”属性,就像我通常在ruby对象上访问其属性一样? ( “my_ruby_obj.price”)
我尝试使用console.log(data.price);
> Undefined
我觉得我在这里错过了一大块......我想这与json如何处理对象有关..
有任何帮助吗? 如果可能的话,我正在寻找一种正确的方法来使用jquery。
由于
修改 试图了解发生了什么,我在回调中尝试了这个:
newdata = $.parseJSON(data);
但调试控制台暂停显示:
> uncaught exception: Invalid JSON: #<Obj:0x1c9b018>
我确实在ruby对象上调用了.to_json,为什么会这么说呢? ...
[[的 new_edit:]]
似乎像自定义类中的对象的ruby json序列化不能像我想象的那样工作:
从这里引用:https://stackoverflow.com/a/4464721/988591
对于来自您自己的类的对象来说会有点困难。对于 下面的类,to_json会产生类似的东西
"\"#<A:0xb76e5728>\""
。这可能是不可取的。有效地 将您的对象序列化为JSON,您应该创建自己的to_json 方法
示例如下...... 但是......哇......有没有更简单的方法呢?
答案 0 :(得分:0)
您将通过javascript返回对象的字符串表示形式,而不是其自身的对象。
你需要返回一个JSON表示:
render json: my_ruby_obj.to_json
或者甚至更好,如果你知道你需要访问的字段:
render json: {price: my_ruby_obj.price}
答案 1 :(得分:0)
好的我找到了我想要的东西!自动快速解决方案,还带来其他方面的好处(速度更快!)。
标准json gem仅适用于某些类(Array,Hash,..),并且无法将您创建的自定义类/对象转换为JSON。它不知道如何组织数据,除非你为自己写了一个自定义的.to_json方法,这是我要避免的。
所以最后我发现了一个名为 Oj 的宝石:Optimized Json(宝石安装oj)
引用作者:
优化的JSON(Oj),顾名思义是为了提供速度而编写的 优化的JSON处理。它被设计为更快的替代品 Yajl和其他常见的Ruby JSON解析器。到目前为止已经实现了 大约比Yajl快2倍的时间用于解析和3次或更多次 更快写JSON 。
Oj有几种转储或序列化模式,用于控制对象如何转换为JSON。这些模式使用:mode选项设置 默认选项或dump()的选项之一 方法
:object 模式会将任何对象转储为带有键的JSON对象 匹配Ruby对象的变量名称而不带“@”字符。这个 是最高性能模式。
我这样使用它:
json = Oj.dump(guy, mode: :object)
但在我的情况下,它没有模式::对象也是如此。
现在console.log(data);
显示:
({'^o':"Human", x:38, y:58, name:"Jack", bday:{'^t':1352083824.5625}, age:50})
既然序列化工作正常,我终于可以了:
console.log(data.age);
// ---&gt; 50 强>
序列化也更快。
..虽然已经很长时间了;)
非常感谢您访问图书馆作者:http://twitter.com/#!/peterohler