Ruby数据结构呈现某种JSON格式

时间:2010-04-18 20:48:02

标签: ruby-on-rails json

[
   {
      "id":"123",
      "name":"House"
   },
   {
      "id":"1456",
      "name":"Desperate Housewives"
   },
   {
      "id":"789",
      "name":"Dollhouse"
   },
   {
      "id":"10",
      "name":"Full House"
   }
]

如何渲染以在Ruby中生成此JSON格式?我收集了来自DB(@result)的所有数据,并且不知道在Ruby中使用什么数据结构,当我这样做时将呈现给它:

respond_to do |format|    
    format.json { render :json => @result}
end

@result应该是什么数据结构,我如何迭代生成它?谢谢!

4 个答案:

答案 0 :(得分:6)

如果@result是ActiveRecord模型实例的数组,那么render :json => @result将生成类似于您所使用的内容,但将包含模型的所有属性(render调用{{1你传递它的对象,除非它是一个字符串)。

要仅包含ID和name属性,您可以使用to_jsonto_json参数:

:only

或者,您可以创建仅包含所需属性的Hash对象数组:

respond_to do |format|    
  format.json { render :json => @result.to_json(:only => [:id, :name] }
end

编辑:请参阅下面的@ dt评论。名为text的模型中有一个属性需要作为名称输出。这可以通过在模型中为文本创建别名来完成:

respond_to do |format|    
  format.json { render :json => 
                  @result.collect {|o| {:id => o.id, :name => o.name} } }
end

并使用class Model < ActiveRecord::Base alias_method :name, :text 包含名称:

:methods

或者,哈希方法数组可用于重命名属性:

respond_to do |format|    
  format.json { render :json => @result.to_json(:only => :id, :methods => :name }
end

答案 1 :(得分:0)

尝试使用json gem。它允许你做像

这样的事情
@result.to_json

将您的结构(例如,哈希)转换为json格式。如果您正在使用Ruby on Rails,那么您应该已经可以访问此功能,因此只需创建一个Hash并调用to_json。

答案 2 :(得分:0)

要创建该特定格式的JSON对象,需要一个包含其元素哈希值的ruby数组。

@result = [{:id => "10", :name => "Full House"}, {:id => "789", :name => "blahblah"},...]

Rails会在渲染响应块中正确地将ruby数组转换为json:

respond_to do |format|    
  format.json { render :json => @result}
end

答案 3 :(得分:0)

我使用的jQuery插件(FCBKComplete)需要具有特定键名的json结果,特别是'caption'和'value',这在我调用to_json的数组中不存在。

所以我这样做了(hacky,但它确实有效):

render :json => taggings.map { |t| {:caption => t.tag.name, :value => t.tag.name} }.to_json

其中taggings是由ActiveRecord查找返回的数组,并返回json,如下所示:

[{"value":"tag.a","caption":"tag.a"},{"value":"tag.b","caption":"tag.b"}]