如何用这个Ruby类生成一些简单的json?

时间:2010-07-28 13:36:39

标签: ruby-on-rails ruby json

这是一个简单的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的情况下获得这个吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

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