Crystal 언어에서 JSON::Any과 JSON::Type의 차이점은 무엇입니까? 이 유형의 사용 사례는 무엇입니까?Crystal에서 JSON :: Any와 JSON :: Type의 차이점은 무엇입니까?
3
A
답변
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 data에 JSON::Any
구조체에 의해 내부적으로 사용됩니다
p obj.raw # => {"access" => true}
p obj.raw.class # => Hash(String, JSON::Type)
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"
이제 훨씬 더 명확 해졌습니다. 그러나 내가 아직도 이해하려고 노력하고있는 것은 그 뒤에있는 추론이다. 왜'raw' 단어와 관련된'JSON :: Type' 메소드가 전부입니까? 'JSON.parse'는'JSON :: Any'를 반환하지만'JSON :: parse_raw'는'JSON :: Type'을 반환합니다. 'JSON :: Any # raw'는 차례대로'JSON :: Type'을 반환합니다. 어쩌면 단순한 언어 문제 일 수도 있지만 Type이 Raw 인 이유는 무엇입니까? – vtambourine
아마도이 이름 규칙에 혼란 스러울 것입니다. 'raw'는'JSON :: Type' 타입의 객체입니다. 'Bool','Int64','Float64','String','Hash','Array','Nil' 등 (가능한 json 형식과 유사합니다) 일 수 있습니다. 그것은 나에게 논리적으로 보인다. JSON :: Any는 편리한 래퍼 일뿐입니다. –
'JSON.parse_raw'는'raw'를 반환하고 래퍼를 생성하지 않습니다. 'JSON.parse # raw'의보다 뛰어난 성능을 가진 아날로그입니다. –