-3

在红宝石中:

class Obj
  attr_accessor :price
end

my_ruby_obj = Obj.new

把 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 ,那为什么这么说呢?...

[[新编辑: ]]

似乎来自自定义类的对象的 ruby​​ json 序列化不像我想象的那样工作:

从这里引用:https ://stackoverflow.com/a/4464721/988591

对于您自己的类中的对象,这将更加困难。对于下面的类, to_json 将产生类似 "\"#<A:0xb76e5728>\"". 这可能是不可取的。为了有效地将您的对象序列化为 JSON,您应该创建自己的 to_json 方法。

示例如下...但是..哇...没有更简单的方法吗?

4

2 回答 2

0

好的,我找到了我想要的东西!一种自动化的快速解决方案,它还具有其他好处(更快的速度!)。

标准 json gem 仅适用于某些类(数组、哈希、..),不能将您创建的自定义类/对象转换为 JSON。它不知道如何组织数据,除非您为自己的类编写自定义 .to_json 方法,这是我试图避免的。

所以最后我找到了一个叫做Oj的 gem :Optimized Json (gem install oj)

引用作者的话:

顾名思义,优化的 JSON (Oj) 是为了提供速度优化的 JSON 处理而编写的。它被设计为 Yajl 和其他常见 Ruby JSON 解析器的更快替代方案。到目前为止,它的解析速度比 Yajl 快 2 倍,编写 JSON 的速度快 3 倍或更多倍

Oj 有几种转储或序列化模式,它们控制如何将对象转换为 JSON。这些模式在默认选项中使用 :mode 选项设置,或者作为 dump() 方法的选项之一。

:object模式会将任何 Object 转储为 JSON 对象,其键与 Ruby 对象的变量名匹配,但不带 '@' 字符。这是最高性能模式。

我这样使用它:

json = Oj.dump(guy, mode: :object)但在我的情况下,它也可以在没有 mode: :object 的情况下工作。

现在console.log(data);显示:

({'^o':"Human", x:38, y:58, name:"Jack", bday:{'^t':1352083824.5625}, age:50})

现在序列化运行良好,我终于可以做到了:

console.log(data.age);// ---> 50

序列化也更快。

..这是一段漫长的旅程;)

非常感谢图书馆作者: http: //twitter.com/# !/peterohler

于 2012-11-05T03:32:02.633 回答
0

您通过 javascript 返回对象的字符串表示形式,而不是对象本身。

您需要为它返回一个 JSON 表示:

render json: my_ruby_obj.to_json

或者更好的是,如果您知道需要访问的字段:

render json: {price: my_ruby_obj.price}
于 2012-11-05T00:27:22.200 回答