programing

루비 lib의 JSON.load와 JSON.parse 메서드의 차이점은 무엇입니까?

muds 2023. 3. 27. 21:43
반응형

루비 lib의 JSON.load와 JSON.parse 메서드의 차이점은 무엇입니까?

루비 문서를 보면 알 수 있습니다.load하고 method는 proc를 arg로 취득합니다.parse그렇지 않다.른른른른른른른른른른?예를 들어 JSON 문자열이 있을 때 어떤 방법으로 루비 오브젝트로 변환하면 좋을까요?

load(source, proc = nill, options = {}) JSON 소스에서 루비 데이터 구조를 로드하여 반환합니다.소스는 문자열 모양 개체, IO 모양 개체 또는 읽기 메서드에 응답하는 개체 중 하나입니다.proc가 지정된 경우, 모든 nested Ruby 오브젝트와 함께 깊은 첫 번째 순서로 재귀적으로 인수로 호출됩니다.기본 옵션을 변경하려면 옵션 인수에도 전달합니다.이 메서드는 Marshal 및 YAML의 로드/덤프 인터페이스 구현의 일부입니다.복원이라고도 합니다.

parse(source, opts = {}) JSON 문서 원본을 Ruby 데이터 구조로 구문 분석하고 반환합니다.

JSON#parseJSON 문자열을 루비 해시에 해석합니다.

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

JSON#load 또는 등)중를 Ruby Hash/합니다.

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"}

중요한 차이점은 이다.JSON.load할 수 없는 입력이 주어지면 하지 않습니다( 「할 수 없다」(「신뢰할 수 없다」)JSON.parse(서양속담, 서양속담)이는 "일반" 해시, 문자열, 배열, 숫자 클래스 이외의 클래스를 인스턴스화하는 방법을 제공하기 때문입니다.

class Foo
  def self.json_creatable?
    true
  end
  def self.json_create attributes
    puts "called with #{attributes}"
  end
end

JSON.parse('{"json_class": "Foo"}') #=> {"json_class"=>"Foo"} 

반면에.

JSON.load('{"json_class": "Foo"}')
called with {"json_class"=>"Foo"}
#=> nil

이것은 데이터의 커스텀시리얼라이제이션 실장을 목적으로 하고 있습니다.와이드 월드의 데이터를 해석할 때는 사용하지 말아 주세요. ''은 .json_creatable? ★★★★★★★★★★★★★★★★★」json_create실제로 , 하거나 실행하지 하십니까?그러나, 당신의 의존관계 중 어느 것도 이것을 행하거나 실행하지 않는다고 얼마나 확신하십니까?method_missing오용될 수 있는 방법으로요? (예: 악용 사례 참조).그 결과JSON.load&JSON.parse상당히 강화되었습니다.)

「」를 사용합니다.JSON.parse할 수 없는 또는 하지 않은 JSON.load

하나 점은 또 one one one one one one one one one one one one one one one one 。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

서 ★★★★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_max:구문 분석된 데이터 구조에서 허용되는 중첩의 최대 깊이입니다.:max_deach => false를 사용하여 깊이 체크를 비활성화합니다.기본값은 100 입니다./
  • allow_nan: true로 설정되어 있는 경우 RFC 7159에 관계없이 NaN, Infinity 및 -Infinity를 파서로 해석할 수 있습니다.이 옵션은 기본적으로 false입니다.
  • symbol_names:true로 설정하면 JSON 개체의 이름(키)에 대한 기호를 반환합니다.그렇지 않으면 문자열이 반환됩니다.기본값은 문자열입니다.
  • create_create:false로 설정하면 일치하는 클래스와 create_id가 발견되더라도 파서는 추가를 만들지 않습니다.이 옵션은 기본적으로 false입니다.
  • object_class:디폴트: 해쉬
  • array_class:디폴트로는 어레이

왜죠

참조JSON#parse, 의 소스 코드를 참조합니다.JSON#load세 번째 줄부터 마지막 줄까지,result = parse(source, opts),그렇게load사실은parse4가지 기본 옵션이 있습니다.

그 이유는 다음과 같습니다.

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

다른 방법으로 해석할 대상이 응답하는 경우to_io의미는 파일,load그래도 말이 되네단, 해석은 하지 않습니다.

또 다른 차이점은 다른 옵션입니다.
일반적인 사용 예(주)_keys대._names):

JSON.load '{"key": "val"}', symbolize_keys: true
=> {"key" => "val"}         # parse option syntax silently ignored 

JSON.parse '{"key": "val"}', symbolize_keys: true
=> {:key => "val"}          # symbols, yay!

JSON.load '{"key": "val"}', symbolize_names: true
=> {:key => "val"}          # using the correct syntax for load

언급URL : https://stackoverflow.com/questions/17226402/whats-the-difference-between-json-load-and-json-parse-methods-of-ruby-lib

반응형