当前位置: 首页 > 知识库问答 >
问题:

如何在JSON模式中扩展模式?

郭兴文
2023-03-14

我对文档模式的定义如下:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "id": "http://example.com/schemas/document.json#",
  "title": "Document",
  "type": "object",
  "additionalProperties": false,
  "required": ["type", "name", "fields"],
  "properties": {
    "type": {
      "constant": "document"
    },
    "name": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "readOnly": {
      "type": "boolean"
    },
    "properties": {
      // common properties 
      // model-specific properties
    }
  }
}

    共有2个答案

    常心水
    2023-03-14

    当使用NodeJs时,通过使用ajv验证器的少量代码,很容易绕过简单模式的限制,如下所示:

    function extendJsonSchema(baseSchema, extendingSchema) {
        let extendedSchema = Object.assign({}, extendingSchema);
        extendedSchema.properties = Object.assign(extendedSchema.properties, baseSchema.properties)
        extendedSchema.required = extendedSchema.required.concat(baseSchema.required)
        return extendedSchema
    }
    
    
    let baseSchema = require('./base.schema.json')
    let extendingSchema = require('./extending.schema.json')
    
    let extendedSchema = extendJsonSchema(baseSchema, extendingSchema)
    const validate = ajv.compile(extendedSchema)
    

    这至少解决了我的用例。

    罗允晨
    2023-03-14

    因此,您可以使用组合来“扩展”一个模式,但是您永远不能“覆盖”另一个模式定义的内容。

    让我们来看一个没有冲突属性的简单扩展示例。

    /schema/base

    {
      "type": "object",
      "properties": {
        "foo": { "type": "string" },
        "bar": { "type": "string" }
      }
    }
    

    /schema/扩展

    {
      "allOf": [{ "$ref": "/schema/base" }],
      "properties": {
        "baz": { "type": "string" }
      }
    }
    

    这对JSON模式非常有用。现在让我们来看一个属性定义冲突的示例。

    /模式/覆盖

    {
      "allOf": [{ "$ref": "/schema/base" }],
      "properties": {
        "bar": { "type": "integer" },
        "baz": { "type": "boolean" }
      }
    }
    

    在本例中,两个模式都有一个< code>/properties/bar字段。如果你从继承的角度考虑这个问题,你会误解这里发生的事情。在这种情况下,两个“/属性/栏”字段都必须有效。没有要解决的冲突。正如关键字所说,“所有”模式都必须有效。因为< code>bar不可能既是整数又是字符串,所以没有文档会根据< code>/schema/override进行验证。

    希望这能给你足够的信息来解决你的问题,避免最常见的问题。

     类似资料:
    • 我正在与Avro/Kafka和Confluent的Avro模式注册中心合作。 我使用avsc文件和avdl制作了一些基本模式和具有基本类型的主题。 我正在查看Confluent制作的API文档,以尝试将模式发展到版本2。特别是本部分: https://docs.confluent.io/current/schema-registry/using.html#register-a-new-versio

    • 问题内容: 窗口小部件现在包括显示模式的概念(由NCWidgetDisplayMode表示),该概念使您可以描述可用的内容量,并允许用户选择压缩视图或展开视图。 如何在ios 10.0中扩展小部件?它无法在ios 9中运行。 问题答案: 好的,我在这里找到了正确的解决方案。 1)设定的显示模式到第一中: 2)实施新的协议方法: 它将作为官方应用程序运行。 图片

    • 如何使用扩展 想象一下这个场景,我们需要在下面这个列表里展示数据: 专辑标题从哪里来? Album 本身是个 Model 对象,所以它不应该负责如何展示数据。你需要一些额外的代码添加展示数据的逻辑,但是为了保持 Model 的干净,我们不应该直接修改代码,因为这样不符合单一职责原则。 Model 层最好就是负责纯粹的数据结构,如果有数据的操作可以放到扩展中完成。 接下来我们会创建一个扩展,扩展现有

    • 扩展 扩展是一种十分强大的机制,可以让你在不用继承的情况下,给已存在的类、结构体或者枚举类添加一些新的功能。最重要的一点是,你可以在你没有访问权限的情况下扩展已有类。这意味着你甚至可以扩展 Cocoa 的类,比如 UIView 或者 UIImage 。 举个例子,在编译时新加的方法可以像扩展类的正常方法一样执行。这和装饰器模式有点不同,因为扩展不会持有扩展类的对象。

    • 问题内容: 有没有一种方法可以扩展内置的Django Group对象以添加其他属性,类似于可以扩展用户对象的方法?使用用户对象,你可以执行以下操作: 并将以下内容添加到settings.py文件中 这使你: 扩展小组有什么等效方法吗?如果没有,我是否可以采用其他方法? 问题答案: 你可以创建一个对Group进行子类化的模型,添加自己的字段,并使用模型管理器返回所需的任何自定义查询集。这是一个截断的

    • 另一个有趣的事情Django已经为你做好了就是模板扩展。这是什幺意思呢?它意味着你可以使用你的HTML相同代码为你网站不同的网页共享。 通过这种方法,当你想使用同样的信息或布局,或者你想改变某些模板内容时,你不必在每个文件中都重复着相同的代码。你仅仅只需要改变一个文件,而不是所有的。 创建一个基础模板 一个基础模板是最重要的模板,你扩展到你网站的每一页。 让我们创建一个base.html文件到bl