【问题标题】:How can I produce some simple json with this Ruby class?如何使用这个 Ruby 类生成一些简单的 json?
【发布时间】:2010-07-28 13:36:39
【问题描述】:

这是一个简单的 ActiveResource 类。它有一些实例变量,甚至可能有一些方法,但它没有任何数据支持。

ruby-1.8.7-p299 > class Box < ActiveResource::Base;
                    attr_accessor :a, :b, :c, :d;
                  end
 => nil

让我们填充它:

ruby-1.8.7-p299 > bx = Box.new; bx.a = 100; bx.b = 200;
                                bx.c = 300; bx.d = 400;
                                bx
 => #<Box:0xb5841c54 @attributes={}, @b=200, @a=100,
       @prefix_options={}, @c=300, @d=400> 

到目前为止一切顺利。我们为它的 JSON 模型挑选一些实例变量怎么样?假设我们只关心bc,而不关心ad 或其他任何东西。

ruby-1.8.7-p299 > bx.to_json({:only => ['b', 'c']})
 => "{}"

然而,这不起作用,因为我们没有称为“b”或“c”的属性,只有值。我们怎么能得到这样的结果?

{ "box": { "b": 200, "c": 300 } }

更好的是,我们可以在不继承 ActiveResource 的情况下获得这个吗?

【问题讨论】:

    标签: ruby-on-rails ruby json


    【解决方案1】:

    在 AR 对象中,您只需使用 to_json 的 'methods' 参数,例如在此页面上:http://www.gregbenedict.com/2007/11/28/outputting-custom-model-attributes-with-to_json/

    在非 AR 对象中,只需定义一个自定义 to_json 方法,您可以在其中组装要 json-ize 的变量的哈希,然后对其进行 to_json 并返回它。就像,这是一个(未经测试的)示例:

    def to_json(options = {})
      {"box" => {"b" => b, "c" => c}}.to_json(options)
    end
    

    【讨论】:

    • 感谢您的回复,杰森。两件快速的事情:请注意,我在这里使用的是 ActiveResource,而不是 ActiveRecord。另外,我不确定methods 是否可以在这里工作:bx.to_json(:methods =&gt; [:b, :c]) 会生成一个包含所有内容的哈希。其次,写"b" =&gt; b, "c" =&gt; c, ... 会不会很重复?有没有办法只指定 JSON-ize 的属性?
    • 我的错,在活动资源上!抱歉,我错过了 :D 关于你所问的问题:你总是可以只用一个符号或字符串列表来表示你想放在 JSON 响应中的方法。我将在上面编辑我的回复以澄清这一点,如果它更像您正在寻找的东西?
    【解决方案2】:

    尝试使用 YAJL-ruby 将您的哈希编码为 json 格式。

    require 'yajl'
    hash = {:only => ['b', 'c']}
    Yajl::Encoder.encode(hash)
    => "{\"only\":[\"b\",\"c\"]}"
    

    http://rdoc.info/projects/brianmario/yajl-ruby

    【讨论】:

      猜你喜欢
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多