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_json和to_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对象,有严格的模式。 检查出来。