如果我在glTF 2.0模式中搜索“枚举”,则会看到很多枚举的定义,例如:
"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的相机定义不一致吗?
提前感谢别人可以提供的任何清晰度。
答案 0 :(得分:1)
在当时(2017年),我们使用的是JSON模式草案v4,并且对枚举的支持还不够。以前有一个简单的枚举列表,但是我要求在架构中有每个枚举的描述。这样可以更好地记录架构中的各个枚举值,并允许格式设置软件显示单个枚举值的描述。我在这里提出了一个问题:
https://github.com/KhronosGroup/glTF/issues/891
进一步研究该问题,发现oneOf
与TypeScript不兼容,并决定改用anyOf
。尽管有此更改,您仍然只能选择可用的枚举之一。
稍后,在实现此更改的请求请求中,规范编辑器explained之一说,最后的额外"type" : "string"
允许将来的前向兼容。基本上,这意味着可以(并鼓励)glTF 2.0扩展名定义核心glTF 2.0模式中不存在的新枚举值,并且它们可以这样做而不会违反该模式。但是,他们不能随意添加新字段,因为架构对此非常严格。必须将新字段放入具有适当名称的extension
或extras
对象中。但是新的枚举可以在与现有枚举相同的字段中使用。
最终,我们最终得出了一个架构,该架构对于人类来说可能有点麻烦,但在处理JSON架构的各种验证软件中都能很好地工作。而且人们可以只看Properties Reference README而不是原始模式文件,这在眼睛上就更容易了。