我正在尝试理解Ruby中的JSON序列化环境。我是新来Ruby的。
如果您不使用Rails,有没有什么好的JSON序列化选项?
这似乎就是这个问题的答案(对于Rails) How to convert a Ruby object to JSON
json gem似乎让它看起来像是您必须编写自己的to_json方法。我还没能让to_json处理数组和散列(文档说它能处理这些),是不是json gem不能只反射对象并使用默认的序列化策略呢?这不就是to_yaml的工作方式吗(在这里猜测)
发布于 2010-12-17 03:42:52
为了使JSON库可用,您可能需要从包管理器安装libjson-ruby
。
要使用'json‘库:
require 'json'
要将对象转换为JSON (这3种方法是等效的):
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
对于来自您自己的类的对象来说,这会有点困难。对于下面的类,to_json将生成类似于"\"#<A:0xb76e5728>\""
的内容。
class A
def initialize a=[1,2,3], b='hello'
@a = a
@b = b
end
end
这可能是不可取的。要有效地将对象序列化为JSON,您应该创建自己的to_json方法。为此,from_json类方法将非常有用。你可以像这样扩展你的类:
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‘类来实现自动化:
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
将保存为JSON字符串的保存状态复制到对象。
发布于 2013-06-19 11:10:58
查看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"
}
https://stackoverflow.com/questions/4464050
复制相似问题