我正在尝试了解Ruby中的JSON序列化格局。我是Ruby的新手。
如果您不使用Rails,是否有任何好的JSON序列化选项?
这似乎是(Rails的)答案的出路 如何将Ruby对象转换为JSON
json gem似乎使您看起来必须编写自己的to_json方法。我还无法使to_json与数组和哈希一起使用(文档说可以与它们一起使用)难道是json gem不能仅仅反映对象并使用默认序列化策略的原因吗?这不是to_yaml的工作原理(在这里猜测)
我正在尝试了解Ruby中的JSON序列化格局。我是Ruby的新手。
如果您不使用Rails,是否有任何好的JSON序列化选项?
这似乎是(Rails的)答案的出路 如何将Ruby对象转换为JSON
json gem似乎使您看起来必须编写自己的to_json方法。我还无法使to_json与数组和哈希一起使用(文档说可以与它们一起使用)难道是json gem不能仅仅反映对象并使用默认序列化策略的原因吗?这不是to_yaml的工作原理(在这里猜测)
Answers:
为了使JSON库可用,您可能必须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
对于您自己类中的对象,这将变得有些困难。对于以下类,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
序列object.from_json! string
化为JSON并将复制为JSON字符串的保存状态复制到该对象。
in `to_json': wrong number of arguments (1 for 0) (ArgumentError)
to_json(options={})
修复。看到stackoverflow.com/questions/11599610/...
签出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"
}
Oj
与更改类和反序列化它们具有极大的兼容性,而不会产生其他错误。+1
:compat
模式完成此操作。
您正在使用哪个版本的Ruby?ruby -v
会告诉你。
如果为1.9.2,则标准库中包含JSON。
如果您使用的是1.8.something,请gem install json
安装并安装。然后,在您的代码中执行:
require 'rubygems'
require 'json'
然后附加to_json
到一个对象,您就可以开始:
asdf = {'a' => 'b'} #=> {"a"=>"b"}
asdf.to_json #=> "{"a":"b"}"
Benchmark
,不是吗?
由于我自己进行了大量搜索,以将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}
Jbuilder是Rails社区构建的瑰宝。但是它在非铁路环境中运行良好,并且具有很酷的功能。
# 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的宝石,https://github.com/treeder/jsonable。很甜
JSON.parse
返回json,而不是对象。
require 'json'
吗?我使用JSON宝石,它们像魅力一样工作。