为什么glTF模式会这样定义枚举?

时间:2019-05-23 19:06:12

标签: json enums jsonschema gltf

如果我在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

对此我有几个问题:

  1. 我不明白为什么这是anyOf而不是oneOf?我的理解是相机类型是透视图或正交图,而我对json模式的理解是'anyOf' allows validation against multiple values in the array)。

  2. 我不了解“ type”:“ string”字段?对我来说,似乎任何字符串值都有效吗?这似乎与glTF的相机定义不一致吗?

有多个这样的枚举实例。也可以看看: here here

提前感谢别人可以提供的任何清晰度。

1 个答案:

答案 0 :(得分:1)

在当时(2017年),我们使用的是JSON模式草案v4,并且对枚举的支持还不够。以前有一个简单的枚举列表,但是我要求在架构中有每个枚举的描述。这样可以更好地记录架构中的各个枚举值,并允许格式设置软件显示单个枚举值的描述​​。我在这里提出了一个问题:

https://github.com/KhronosGroup/glTF/issues/891

进一步研究该问题,发现oneOf与TypeScript不兼容,并决定改用anyOf。尽管有此更改,您仍然只能选择可用的枚举之一。

稍后,在实现此更改的请求请求中,规范编辑器explained之一说,最后的额外"type" : "string"允许将来的前向兼容。基本上,这意味着可以(并鼓励)glTF 2.0扩展名定义核心glTF 2.0模式中不存在的新枚举值,并且它们可以这样做而不会违反该模式。但是,他们不能随意添加新字段,因为架构对此非常严格。必须将新字段放入具有适当名称的extensionextras对象中。但是新的枚举可以在与现有枚举相同的字段中使用。

最终,我们最终得出了一个架构,该架构对于人类来说可能有点麻烦,但在处理JSON架构的各种验证软件中都能很好地工作。而且人们可以只看Properties Reference README而不是原始模式文件,这在眼睛上就更容易了。