【问题标题】:Ruby data structure to render a certain JSON formatRuby 数据结构呈现某种 JSON 格式
【发布时间】:2010-04-18 20:48:02
【问题描述】:
[
   {
      "id":"123",
      "name":"House"
   },
   {
      "id":"1456",
      "name":"Desperate Housewives"
   },
   {
      "id":"789",
      "name":"Dollhouse"
   },
   {
      "id":"10",
      "name":"Full House"
   }
]

如何在 Ruby 中渲染以生成这种 JSON 格式?我有来自数据库 (@result) 的所有数据,但不知道在 Ruby 中使用什么数据结构会在我执行此操作时呈现:

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

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

【问题讨论】:

    标签: ruby-on-rails json


    【解决方案1】:

    如果 @result 是 ActiveRecord 模型实例的数组,那么 render :json => @result 将产生类似于您所追求的东西,但会包含模型的所有属性(render 在您传递的对象上调用 to_json除非它是一个字符串)。

    要只包含id和name属性,可以使用to_json:only参数:

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

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

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

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

    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
    

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

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

    【讨论】:

    • 谢谢,差不多了,但问题是我从 ActiveRecord 得到的结果没有 :name 属性,所以基本上我需要遍历它并重新分配我的属性(文本)命名,所以我想我可能需要在 for/do 循环中创建一个哈希,然后将它添加到一个数组中? @simianarmy 建议一些接近的东西,但我不知道如何迭代来创建它。顺序重要吗?当我打印出来时,它总是把名字放在 id 之前。那有关系吗? @evgeny 我已经安装了 gem,谢谢!谢谢你。每个答案都有帮助!
    • 'id' 是否在 'name' 之前并不重要。
    • @dt 有两种选择: 1) 在模型中添加一个名为name 的方法,然后调用@result.to_json(:only =&gt; :id, :methods =&gt; :name)。 2) 修改collect 语句重命名属性:`@result.collect {|o| {:id => o.id, :name => o.text}}。输出中属性的顺序将取决于 Hash 如何对键进行排序,但对于解析 JSON 输出的任何内容都应该不重要。
    • 正是我想要的。你摇滚!
    【解决方案2】:

    尝试使用json gem。它可以让你做类似的事情

    @result.to_json
    

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

    【讨论】:

      【解决方案3】:

      要创建该特定格式的 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
      

      【讨论】:

      • resultsarray = [] for r in @result resultshash = {:id => r.id, :name => r.text} resultsarray
      【解决方案4】:

      我正在使用一个 jQuery 插件 (FCBKComplete),它需要具有特定键名的 json 结果,特别是“标题”和“值”,这在我调用 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"}]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多