json - 为什么 glTF 模式要这样定义枚举?

标签 json enums jsonschema gltf

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

我对此有几个问题:

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

  2. 我不明白“type”:“string”字段?对我来说,这听起来好像任何字符串值都是有效的?这似乎与glTF的相机定义不一致?

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

预先感谢有人提供的任何说明。

最佳答案

当时(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 模式中不存在的新枚举值,并且它们可以在不违反模式的情况下这样做。然而,他们不能随意添加新字段,因为架构对此有严格要求。新字段必须放入适当名称的 extensionextras 对象中。但是新的枚举可以直接出现在现有枚举所在的同一字段中。

最终,我们得到了一个模式,对于人类来说可能有点麻烦,但在处理 JSON 模式的各种验证软件中运行良好。人类只需查看 Properties Reference README而不是原始模式文件,它更方便眼睛。

关于json - 为什么 glTF 模式要这样定义枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56281523/

相关文章:

c++ - 返回枚举的基础类型和整数的整数的元编程构造

c# - Asp.net core WebApi 中空值的自定义序列化

javascript - 如何使用 CORS 实现 JavaScript Google Places API 请求

java - 为什么 Java 枚举文字不能具有泛型类型参数?

java - 为什么这个 Java 枚举代码无法编译?

javascript - 查找对象的值

c# - 使用 JSON 的 WCF RESTful POST,来自 Windows 应用商店应用

android - 使用 firebase 的用户数据的 json 格式

python - 如果可选属性无效,JSON 架构会抛出验证错误

python - pkg_resources.DistributionNotFound : 'jsonschema'