Apply required field to referenced JSON data schema

无人久伴 提交于 2021-01-28 00:54:20

问题


I have the following use-case I try to solve with JSON schemas.

I have a generic JSON data schema for, for example, a user. Here is an example of the user.schema.json file.

{
  "type": "object",
  "definitions": {},
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1
    },
    "email": {
      "type": "string",
      "minLength": 1
    },
    "locale": {
      "type": "string",
      "minLength": 1
    },
    "active": {
      "type": "boolean",
      "default": true
    },
    "password": {
      "type": "string",
      "minLength": 8
    },
    "roles": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1
      }
    }
  }
}

Now I have 2 different kinds of requests: - POST: Add a user - PATCH: Update user data.

In 1 case, I can send this data structure, with 3 required fields, while in case of a patch each field is optional. So I get the post request file: post-user.schema.json:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$ref": "user.schema.json",
  "required": [
    "name",
    "password",
    "email"
  ]
}

And for my patch (path-user.schema.json:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$ref": "user.schema.json"
}

Now the issue that I am having is that my POST schema also marks a user like:

{
    "name": "NoPassword",
    "email": "nopassword@moba.nl",
    "roles": []
}

Which is missing the required password field, as a valid JSON schema.

Apparently, this is not the way to assign required fields to a referenced data structure. I have tried to use google to see what I can find on the subject regarding this using searches like: [ how to assign required field to referenced schema's ] and I tried to obtain this info from the documentation.

I have no luck.

My questions now are: A. Is it possible to assign required fields to a $referenced json schema data object. B. If this is possible how to do it C. If this is not possible, what would be a good way to approach this.

Any help is much appreciated.


回答1:


Using $ref results in all other properties in the object being ignored, so you need to wrap your use of $ref.

Let's take a look at the spec:

An object schema with a "$ref" property MUST be interpreted as a
"$ref" reference. The value of the "$ref" property MUST be a URI
Reference. Resolved against the current URI base, it identifies the
URI of a schema to use. All other properties in a "$ref" object MUST be ignored.

https://tools.ietf.org/html/draft-handrews-json-schema-01#section-8.3

Then consider the schema you included in your question:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$ref": "user.schema.json",
  "required": [
    "name",
    "password",
    "email"
  ]
}

Reading the spec, you can see why required will be ignored.

Originally $ref was only designed to replace a WHOLE object, not ADD to the conditions for the object.

What you want is for multiple schemas to be applied to the instance. To do this, you use allOf.

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "allOf": [
    {
      "$ref": "user.schema.json"
    },
    {
      "required": [
        "name",
        "password",
        "email"
      ]
    }
  ]
}

I loaded this schema into a demo for you to test at https://jsonschema.dev - although it doesn't support references yet, so I transcluded the reference, but the validation will work the same.

From draft-8 onwards, $ref will behave as you expect, as it becomes an applicator keyword rather than a keyword with special behaviours, meaning other keywords in the same object will not need to be ignored.



来源:https://stackoverflow.com/questions/57198531/apply-required-field-to-referenced-json-data-schema

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!