web-dev-qa-db-ja.com

JSONスキーマでスキーマを拡張する方法は?

データモデリングにJSONスキーマを使用しています。ベースDocumentスキーマを定義します。これは、後でモデルスキーマを定義するために使用します(例:ProductCategoryUserなど)。

これは、すべてのモデルに特定の構造/ルールを継承させたいためです。たとえば、すべてのモデルインスタンスには、特定の共通プロパティ(idcreatedAtupdatedAtなど)が必要です。 OOP用語:Product extends Documentであるため、そのインスタンスプロパティを継承します。スキーマ用語では(私はそう思います)Documentは、モデルスキーマを作成するためのメタスキーマです。

Documentスキーマを次のように定義しました。

{
  "$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
    }
  }
}
  1. DocumentメタスキーマがベースJSONスキーマ(draft-07)を「拡張」するように指定するには、ドラフトのすべてのプロパティを定義する必要がないようにします($schemaidなど)?
  2. 各モデルスキーマ定義で定義する必要なしに、各モデルスキーマのpropertiesにいくつかの共通プロパティ(idcreatedAt、...)が含まれていることを指定するにはどうすればよいですか。 ?
6

NodeJを使用する場合、次のように 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)

これにより、少なくとも私のユースケースが解決されます。

1