代码之家  ›  专栏  ›  技术社区  ›  Lombas

是否可以验证默认值类型是否与json模式上的属性类型匹配?

  •  0
  • Lombas  · 技术社区  · 6 月前
    var jsonSchema = @"{
                ""$schema"": ""https://json-schema.org/draft/2020-12/schema"",
                ""type"": ""object"",
                ""properties"": {
                    ""isCommander"": {
                    ""type"": ""boolean"",
                    ""description"": ""Is a Commander on a star ship"",
                    ""default"": ""thisIsStringNotBoolean""
                    }
                }
            }";
    var jsonSchemaObj = JsonSerializer.Deserialize<JsonSchema>(jsonSchema)!;
    

    这段代码会抛出某种错误,或者我可以调用jsonSchemaObj上的方法来查找默认值类型的不一致。

    1 回复  |  直到 6 月前
        1
  •  2
  •   gregsdennis    6 月前

    简短的回答是“不,JSON Schema不这样做。”

    JSON模式 default examples 关键字是注释,这意味着它们的值是消费者的元数据,不参与验证。验证这些关键字是否符合包含它们的模式的约束存在固有的困难。

    模式正确性通常由元模式(验证模式的模式)强制执行。当一个模式被其元模式验证时,该模式(通常)仅被视为用于表达它的JSON数据 模式。

    例如,在验证时

    {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "type": "string"
    }
    

    根据其元模式(由 $schema 值),上面不是一个模式,它被认为是“只是数据”,元模式就是“模式”。然后进行验证。

    因此,当添加 违约 关键字:

    {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "type": "string",
      "default": false
    }
    

    没有任何上下文表明 type 关键字应向值添加约束 违约 关键字。对于验证来说,这一切都只是数据,规范说 违约 可以是任何JSON值。

    (这是对元模式验证的过度简化。)


    JSON Schema项目认为,这种验证最好由编辑器和语言服务器提供,它们可以通过专门配置来检测这类内容,从而帮助模式作者。因此,仅仅一个验证器并不能真正支持这一点。

    推荐文章