本文简要介绍ruby语言中 JSON.load
的用法。
用法
load(source, proc = nil, options = {}) → object
返回通过解析给定的 source
创建的 Ruby 对象。
-
参数
source
必须是或可转换为字符串:-
如果
source
响应实例方法to_str
,则source.to_str
成为源。 -
如果
source
响应实例方法to_io
,则source.to_io.read
成为源。 -
如果
source
响应实例方法read
,则source.read
成为源。 -
如果以下两个都为真,则 source 变为字符串
'null'
:-
选项
allow_blank
指定一个真实值。 -
如上所述,源是
nil
或空字符串''
。
-
-
否则,
source
仍然是源。
-
-
参数
proc
如果给定,则必须是接受一个参数的 Proc。它将被每个结果递归调用(深度优先顺序)。请参阅下面的详细信息。注意:此方法旨在序列化来自受信任用户输入的数据,例如来自您自己的数据库服务器或您控制下的客户端,允许不受信任的用户将JSON
源传递给它可能是危险的。 -
参数
opts
(如果给定)包含用于解析的选项哈希。请参阅解析选项。可以通过方法JSON.load_default_options=
更改默认选项。
当没有给出proc
时,如上修改source
并返回parse(source, opts)
的结果;见 parse
。
以下示例的来源:
source = <<-EOT
{
"name": "Dave",
"age" :40,
"hats": [
"Cattleman's",
"Panama",
"Tophat"
]
}
EOT
加载字符串:
ruby = JSON.load(source)
ruby # => {"name"=>"Dave", "age"=>40, "hats"=>["Cattleman's", "Panama", "Tophat"]}
加载一个 IO 对象:
require 'stringio'
object = JSON.load(StringIO.new(source))
object # => {"name"=>"Dave", "age"=>40, "hats"=>["Cattleman's", "Panama", "Tophat"]}
加载一个文件对象:
path = 't.json'
File.write(path, source)
File.open(path) do |file|
JSON.load(file)
end # => {"name"=>"Dave", "age"=>40, "hats"=>["Cattleman's", "Panama", "Tophat"]}
当 proc
给出时:
-
如上所述修改
source
。 -
通过调用
parse(source, opts)
获取result
。 -
递归调用
proc(result)
。 -
返回最终结果。
例子:
require 'json'
# Some classes for the example.
class Base
def initialize(attributes)
@attributes = attributes
end
end
class User < Base; end
class Account < Base; end
class Admin < Base; end
# The JSON source.
json = <<-EOF
{
"users": [
{"type": "User", "username": "jane", "email": "jane@example.com"},
{"type": "User", "username": "john", "email": "john@example.com"}
],
"accounts": [
{"account": {"type": "Account", "paid": true, "account_id": "1234"}},
{"account": {"type": "Account", "paid": false, "account_id": "1235"}}
],
"admins": {"type": "Admin", "password": "0wn3d"}
}
EOF
# Deserializer method.
def deserialize_obj(obj, safe_types = %w(User Account Admin))
type = obj.is_a?(Hash) && obj["type"]
safe_types.include?(type) ? Object.const_get(type).new(obj) : obj
end
# Call to JSON.load
ruby = JSON.load(json, proc {|obj|
case obj
when Hash
obj.each {|k, v| obj[k] = deserialize_obj v }
when Array
obj.map! {|v| deserialize_obj v }
end
})
pp ruby
输出:
{"users"=> [#<User:0x00000000064c4c98 @attributes= {"type"=>"User", "username"=>"jane", "email"=>"jane@example.com"}>, #<User:0x00000000064c4bd0 @attributes= {"type"=>"User", "username"=>"john", "email"=>"john@example.com"}>], "accounts"=> [{"account"=> #<Account:0x00000000064c4928 @attributes={"type"=>"Account", "paid"=>true, "account_id"=>"1234"}>}, {"account"=> #<Account:0x00000000064c4680 @attributes={"type"=>"Account", "paid"=>false, "account_id"=>"1235"}>}], "admins"=> #<Admin:0x00000000064c41f8 @attributes={"type"=>"Admin", "password"=>"0wn3d"}>}
相关用法
- Ruby JSON.load_file!用法及代码示例
- Ruby JSON.load_default_options用法及代码示例
- Ruby JSON.load_file用法及代码示例
- Ruby JSON.generator用法及代码示例
- Ruby JSON.dump_default_options用法及代码示例
- Ruby JSON.generate用法及代码示例
- Ruby JSON.state用法及代码示例
- Ruby JSON.pretty_generate用法及代码示例
- Ruby JSON.dump用法及代码示例
- Ruby JSON.parse用法及代码示例
- Ruby JSON.fast_generate用法及代码示例
- Ruby JSON.parse!用法及代码示例
- Ruby JSON.parser用法及代码示例
- Ruby JSON.create_id=用法及代码示例
- Ruby JSON模块用法及代码示例
- Ruby JSON[object]用法及代码示例
- Ruby Time tv_sec用法及代码示例
- Ruby MatchData.pre_match用法及代码示例
- Ruby Symbol capitalize用法及代码示例
- Ruby Matrix lup()用法及代码示例
- Ruby SizedQueue clear()用法及代码示例
- Ruby Object.instance_variable_get用法及代码示例
- Ruby Spotter.spot_op_asgn2_for_name用法及代码示例
- Ruby Float arg()用法及代码示例
- Ruby WIN32OLE_METHOD#visible?用法及代码示例
注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 JSON.load。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。