在Crystal语言中,JSON::Any和JSON::Type有什么区别?这些类型的用例是什么?
JSON::Any是一个结构体,解析后返回的结果。它提供了方便的方法来访问底层数据,例如as_s
,as_bool
,as_f
等:
obj = JSON.parse %({"access": true})
p obj.class # => JSON::Any
p obj["access"] # => true
p obj["access"].class # => JSON::Any
JSON::Type
是所有可能的 JSON 类型的联合类型。它在内部由 JSON::Any
结构使用,用于表示数据:链接
p obj.raw # => {"access" => true}
p obj.raw.class # => Hash(String, JSON::Type)
JSON::Type 是一个递归定义的“别名”:
alias Type = Nil | Bool | Int64 | Float64 | String | Array(Type) | Hash(String, Type)
别名是Crystal类型语法的一部分。详情请参见https://crystal-lang.org/docs/syntax_and_semantics/alias.html
JSON::Any是一个结构体(Struct < Value < Object);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"
JSON :: Type
方法?JSON.parse
返回JSON :: Any
,但JSON :: parse_raw
返回JSON :: Type
。反过来,JSON :: Any#raw
又返回JSON :: Type
。也许这只是简单的语言难题,但为什么Type是Raw呢? - vtambourineraw
是JSON::Type
类型的对象。它可以是Bool
、Int64
、Float64
、String
、Hash
、Array
、Nil
等(就像 json 格式中可能存在的类型一样)。在我看来,这很合乎逻辑。JSON::Any
只是一个方便的包装器。 - Vitalii ElenhauptJSON.parse_raw
is a method that returnsraw
and doesn't create the wrapper for it. It is simply a more performant analog ofJSON.parse#raw
- Vitalii ElenhauptJSON::Any
结构只是JSON::Type
数据结构的一个方便的包装器。 - vtambourine