当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby JSON.load用法及代码示例


本文简要介绍ruby语言中 JSON.load 的用法。

用法

load(source, proc = nil, options = {}) → object
也别名为:restore

返回通过解析给定的 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-lang.org大神的英文原创作品 JSON.load。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。