JSON::Any和JSON::Type在Crystal中有什么区别?

3
在Crystal语言中,JSON::AnyJSON::Type有什么区别?这些类型的用例是什么?
2个回答

5

JSON::Any是一个结构体,解析后返回的结果。它提供了方便的方法来访问底层数据,例如as_sas_boolas_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)

好的,现在更清楚了。但我仍然试图理解的是,背后的原因是什么?为什么所有与“raw”相关的JSON :: Type方法?JSON.parse返回JSON :: Any,但JSON :: parse_raw返回JSON :: Type。反过来,JSON :: Any#raw又返回JSON :: Type。也许这只是简单的语言难题,但为什么Type是Raw呢? - vtambourine
1
你可能会对这些命名规则感到困惑。rawJSON::Type 类型的对象。它可以是 BoolInt64Float64StringHashArrayNil 等(就像 json 格式中可能存在的类型一样)。在我看来,这很合乎逻辑。JSON::Any 只是一个方便的包装器。 - Vitalii Elenhaupt
JSON.parse_raw is a method that returns raw and doesn't create the wrapper for it. It is simply a more performant analog of JSON.parse#raw - Vitalii Elenhaupt
1
谢谢您的解释。通过阅读资料,我更加清楚了。JSON::Any 结构只是 JSON::Type 数据结构的一个方便的包装器。 - vtambourine

2

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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接