Ruby对象和JSON序列化(不含Rails)

我想了解Ruby中的JSON序列化格局。 我是Ruby的新手。

如果您不使用Rails,是否有任何好的JSON序列化选项?

这似乎是这个答案去(Rails) 如何将一个Ruby对象转换为JSON

JSONgem似乎使它看起来像你必须编写自己的to_json方法。 我还没有能够得到to_json来处理数组和散列(文档说,它与这些工作)是否有一个原因,JSONgem不只是反映在对象和使用默认的序列化策略? 这不是如何to_yaml工作(猜测这里)

为了使JSON库可用,您可能需要从包pipe理器安装libjson-ruby

要使用'json'库:

 require 'json' 

将对象转换为JSON(这三种方式是等价的):

 JSON.dump object #returns a JSON string JSON.generate object #returns a JSON string object.to_json #returns a JSON string 

将JSON文本转换为对象(这两种方式是等价的):

 JSON.load string #returns an object JSON.parse string #returns an object 

来自你自己class级的对象会更难一些。 对于下面的类,to_json将产生类似"\"#<A:0xb76e5728>\""

 class A def initialize a=[1,2,3], b='hello' @a = a @b = b end end 

这可能是不可取的。 要有效地将对象作为JSON串行化,您应该创build自己的to_json方法。 为了做到这一点,一个from_json类的方法将是有用的。 你可以这样扩展你的class级:

 class A def to_json {'a' => @a, 'b' => @b}.to_json end def self.from_json string data = JSON.load string self.new data['a'], data['b'] end end 

您可以通过从“JSONable”类inheritance来实现自动化:

 class JSONable def to_json hash = {} self.instance_variables.each do |var| hash[var] = self.instance_variable_get var end hash.to_json end def from_json! string JSON.load(string).each do |var, val| self.instance_variable_set var, val end end end 

然后你可以使用object.to_json来连载到JSON和object.from_json! string object.from_json! string将保存为JSONstring的已保存状态复制到对象。

如果渲染性能至关重要,那么您可能还需要查看yajl-ruby ,它是对C yajl库的绑定。 该序列化的API如下所示:

 require 'yajl' Yajl::Encoder.encode({"foo" => "bar"}) #=> "{\"foo\":\"bar\"}" 

看看Oj 。 在将任何旧对象转换为JSON时都有一些问题,但是Oj可以做到这一点。

 require 'oj' class A def initialize a=[1,2,3], b='hello' @a = a @b = b end end a = A.new puts Oj::dump a, :indent => 2 

这输出:

 { "^o":"A", "a":[ 1, 2, 3 ], "b":"hello" } 

请注意, ^o用于指定对象的类,并在那里帮助反序列化。 要省略^o ,请使用:compat模式:

 puts Oj::dump a, :indent => 2, :mode => :compat 

输出:

 { "a":[ 1, 2, 3 ], "b":"hello" } 

你使用的是什么版本的Ruby? ruby -v会告诉你。

如果是1.9.2,则JSON包含在标准库中 。

如果你在1.8的东西,然后做gem install json ,它会安装。 然后,在你的代码中:

 require 'rubygems' require 'json' 

然后把to_json附加到一个对象上,你很好走:

 asdf = {'a' => 'b'} #=> {"a"=>"b"} asdf.to_json #=> "{"a":"b"}" 
 require 'json' {"foo" => "bar"}.to_json # => "{\"foo\":\"bar\"}" 

由于我自己search了很多,以便将一个Ruby对象序列化为json:

 require 'json' class User attr_accessor :name, :age def initialize(name, age) @name = name @age = age end def as_json(options={}) { name: @name, age: @age } end def to_json(*options) as_json(*options).to_json(*options) end end user = User.new("Foo Bar", 42) puts user.to_json #=> {"name":"Foo Bar","age":42} 

如果您使用1.9.2或更高版本,则可以使用to_json将哈希和数组转换为嵌套的JSON对象。

 {a: [1,2,3], b: 4}.to_json 

在Rails中,你可以在Active Record对象上调用to_json。 你可以通过:include和:只有参数来控制输出:

 @user.to_json only: [:name, :email] 

您也可以在AR关系上调用to_json,如下所示:

 User.order("id DESC").limit(10).to_json 

你不需要导入任何东西,它的工作原理就像你希望的一样。

为了获得构build类(如Array和Hash)以支持as_jsonto_json ,需要使用require 'json/add/core' (请参阅自述文件以了解详细信息)

Jbuilder是一个由rails社区构build的gem。 但是它在非轨道环境中运行良好,并且具有一组很酷的function。

 # suppose we have a sample object as below sampleObj.name #=> foo sampleObj.last_name #=> bar # using jbuilder we can convert it to json: Jbuilder.encode do |json| json.name sampleObj.name json.last_name sampleObj.last_name end #=> "{:\"name\" => \"foo\", :\"last_name\" => \"bar\"}" 

其实,有一个名为Jsonable的gem, https://github.com/treeder/jsonable 。 这很漂亮。

我习惯了virtus 。 真正强大的工具,允许创build一个基于您指定的类的dynamicRuby结构结构。 简单的DSL,可以从ruby哈希创build对象,有严格的模式。 检查出来。