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