如果我在 glTF 2.0 模式中搜索“enum”,我会看到很多枚举的定义,例如:
"type": {
"description": "Specifies if the camera uses a perspective or orthographic projection.",
"gltf_detailedDescription": "Specifies if the camera uses a perspective or orthographic projection. Based on this, either the camera's `perspective` or `orthographic` property will be defined.",
"anyOf": [
{
"enum": [ "perspective" ]
},
{
"enum": [ "orthographic" ]
},
{
"type": "string"
}
]
},
(来自camera schema)
我对此有几个问题:
我不明白为什么这是anyOf而不是oneOf?我的理解是相机类型是透视的或正交的,我对 json 模式的理解是 'anyOf' allows validation against multiple values in the array )。
我不明白“type”:“string”字段?对我来说,这听起来好像任何字符串值都是有效的?这似乎与glTF的相机定义不一致?
预先感谢有人提供的任何说明。
最佳答案
当时(2017 年)我们使用的是 JSON 架构草案 v4,对枚举的支持达不到我们的需要。以前有一个简单的枚举列表,但我要求在模式中包含每个枚举的描述。这可以更好地记录架构中的各个枚举值,并允许格式化软件显示各个枚举值的描述。我在这里提出了一个问题:
https://github.com/KhronosGroup/glTF/issues/891
在这个问题的进一步发展中,oneOf
被发现了一个问题,导致它与 TypeScript 不兼容,因此决定改用 anyOf
。尽管进行了此更改,您仍然只能选择可用枚举之一。
后来,在实现此更改的 Pull Request 中,规范编辑者之一 explained末尾额外的 "type": "string"
是为了允许 future 的向前兼容性。基本上,这意味着允许(并鼓励)glTF 2.0 扩展定义核心 glTF 2.0 模式中不存在的新枚举值,并且它们可以在不违反模式的情况下这样做。然而,他们不能随意添加新字段,因为架构对此有严格要求。新字段必须放入适当名称的 extension
或 extras
对象中。但是新的枚举可以直接出现在现有枚举所在的同一字段中。
最终,我们得到了一个模式,对于人类来说可能有点麻烦,但在处理 JSON 模式的各种验证软件中运行良好。人类只需查看 Properties Reference README而不是原始模式文件,它更方便眼睛。
关于json - 为什么 glTF 模式要这样定义枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56281523/