39

loadruby ドキュメントから、メソッドが proc を arg として受け取り、そうでparseはないことがわかります。他に違いはありますか?たとえば、JSON の文字列がある場合、それを Ruby オブジェクトに変換するにはどのメソッドを使用すればよいでしょうか?

load(source, proc = nil, options = {}) JSON ソースから Ruby データ構造をロードして返します。ソースは、文字列のようなオブジェクト、IO のようなオブジェクト、または read メソッドに応答するオブジェクトのいずれかです。proc が与えられた場合、ネストされた Ruby オブジェクトを引数として深さ優先で再帰的に呼び出されます。デフォルトのオプションを変更するには、オプションのオプション引数も渡します。このメソッドは、Marshal および YAML のロード/ダンプ インターフェイスの実装の一部です。別名: 復元

parse(source, opts = {}) JSON ドキュメント ソースを解析して Ruby データ構造にし、それを返します。

4

5 に答える 5

37

JSON#parseJSON 文字列を Ruby ハッシュに解析します。

 JSON.parse('{"name": "Some Name"}') # => {"name" => "Some Name"}

JSON#load文字列または IO (ファイルなど) のいずれかを受け取り、それを Ruby Hash/Array に変換します

JSON.load File.new("names.json")     # => Reads the JSON inside the file and results in a Ruby Object.

JSON.load '{"name": "Some Name"}'    # Works just like #parse

実際、#readメソッドに応答するすべてのオブジェクトを変換します。例えば:

class A
  def initialize
    @a = '{"name": "Some Name"}'
  end

  def read
    @a
  end
end

JSON.load(A.new)                      # => {"name" => "Some Name"}
于 2013-06-21T03:14:38.733 に答える
20

もう1つの違いは、JSON.loadデフォルトで単一の値(オブジェクトでも配列でもない)を解析することです。

JSON.load("false")
=> false

JSON.load("123")
=> 123

ただし、そのような値を解析するには有効にするJSON.parse必要があります。quirks mode

JSON.parse("false")
JSON::ParserError: 757: unexpected token at 'false'

JSON.parse("false", quirks_mode: true)
=> false
于 2014-10-29T10:00:54.627 に答える
2

ここloadでソースコードをクリックしてください

# File ext/json/lib/json/common.rb, line 323
def load(source, proc = nil, options = {})
  opts = load_default_options.merge options
  if source.respond_to? :to_str
    source = source.to_str
  elsif source.respond_to? :to_io
    source = source.to_io.read
  elsif source.respond_to?(:read)
    source = source.read
  end
  if opts[:allow_blank] && (source.nil? || source.empty?)
    source = 'null'
  end
  result = parse(source, opts)
  recurse_proc(result, &proc) if proc
  result
end

メソッド内の最初の行:

opts = load_default_options.merge options

JSON#load_default_optionsコンソールでを呼び出すことができます:

JSON.load_default_options

=> {:max_nesting=>false, :allow_nan=>true, :quirks_mode=>true, :create_additions=>true}

4 つのデフォルト オプションがあることがわかります。それらの意味は何ですか。ここをクリックしていくつか取得できます。

  • max_nesting: 解析されたデータ構造で許可されるネストの最大深さ。:max_nesting => false で深度チェックを無効にします。デフォルトは 100 です。/
  • allow_nan: true に設定すると、RFC 7159 を無視して NaN、Infinity、および -Infinity がパーサーによって解析されることを許可します。このオプションのデフォルトは false です。
  • symbolize_names: true に設定すると、JSON オブジェクトの名前 (キー) のシンボルが返されます。それ以外の場合は、文字列が返されます。文字列がデフォルトです。
  • create_additions: false に設定すると、一致するクラスと create_id が見つかった場合でも、パーサーは追加を作成しません。このオプションのデフォルトは false です。
  • object_class: デフォルトはハッシュ
  • array_class: デフォルトは配列

どうして

を参照してJSON#parse、 のソース コードを参照してください。JSON#load最後から 3 行目に がありresult = parse(source, opts)ます。load実際には にはparse4 つのデフォルト オプションがあります。

それが理由です:

JSON.load("123") #=> 123
JSON.parse("123", quirks_mode: true) #=> 123

to_io別の方法として、解析対象のオブジェクトがファイルであるという意味に応答する場合 loadでも、意味があります。ただし、パースはしません。

于 2019-11-06T10:34:04.153 に答える