2017-12-29 15 views

답변

4

JSON :: Any is a struct 이는 구문 분석의 결과로 반환됩니다. 그것은 as_f 등 데이터 as_s, as_bool을 기본 액세스 할 수있는 편리한 방법이 있습니다

obj = JSON.parse %({"access": true}) 
p obj.class   # => JSON::Any 
p obj["access"]  # => true 
p obj["access"].class # => JSON::Any 

JSON::Type 가능한 모든 JSON 형식의 조합 유형입니다. represent the dataJSON::Any 구조체에 의해 내부적으로 사용됩니다

p obj.raw    # => {"access" => true} 
p obj.raw.class  # => Hash(String, JSON::Type) 
+0

이제 훨씬 더 명확 해졌습니다. 그러나 내가 아직도 이해하려고 노력하고있는 것은 그 뒤에있는 추론이다. 왜'raw' 단어와 관련된'JSON :: Type' 메소드가 전부입니까? 'JSON.parse'는'JSON :: Any'를 반환하지만'JSON :: parse_raw'는'JSON :: Type'을 반환합니다. 'JSON :: Any # raw'는 차례대로'JSON :: Type'을 반환합니다. 어쩌면 단순한 언어 문제 일 수도 있지만 Type이 Raw 인 이유는 무엇입니까? – vtambourine

+1

아마도이 이름 규칙에 혼란 스러울 것입니다. 'raw'는'JSON :: Type' 타입의 객체입니다. 'Bool','Int64','Float64','String','Hash','Array','Nil' 등 (가능한 json 형식과 유사합니다) 일 수 있습니다. 그것은 나에게 논리적으로 보인다. JSON :: Any는 편리한 래퍼 일뿐입니다. –

+0

'JSON.parse_raw'는'raw'를 반환하고 래퍼를 생성하지 않습니다. 'JSON.parse # raw'의보다 뛰어난 성능을 가진 아날로그입니다. –

2

JSON :: 유형은 재귀 적 정의 "별칭"입니다 :

alias Type = Nil | Bool | Int64 | Float64 | String | Array(Type) | Hash(String, Type) 

별칭 크리스탈의 형태 문법의 일부입니다. 자세한 내용은 https://crystal-lang.org/docs/syntax_and_semantics/alias.html

JSON :: Any는 구조체입니다 (구조체 < 값 <). JSON :: Any의 인스턴스는 JSON 유형의 "원시"값을 보유합니다.

cr(0.24.1) > x=JSON::Any.new("hi") 
=> "hi" 
icr(0.24.1) > x 
=> "hi" 
icr(0.24.1) > x.raw 
=> "hi"