Использование CONST в схеме JSON

#javascript #json #string #jsonschema #ajv

#javascript #json #строка #jsonschema #ajv

Вопрос:

Я использую схему JSON и Ajv, чтобы убедиться, что выбранный JSON действителен в системе.
Мне удалось проверить максимальную длину строки, написав так: "maxLength": 20

Но я не хочу повторяться. СУХОЙ.
Есть ли какой-нибудь способ использовать const подобным образом?

 const MAX_LENGTH = 20
"maxLength": MAX_LENGTH
  

То же число также используется в reducer .
Я попробовал $ref и добился успеха, но этого недостаточно.

Мой код выглядит следующим образом:

 import schema from './schema.json'

export const isValid = ( importedJson ) => {
  const ajv = new Ajv()

  ajv.addMetaSchema(require('ajv/lib/refs/json-schema-draft-06.json'))

  const validate = ajv.compile( schema )

  return validate( importedJson )
}
  
 // schema.json
{
    "$schema": "http://json-schema.org/draft-06/schema#",
    "$ref": "#/definitions/Schema",
    "definitions": {
        "Schema": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "groups": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/Group"
                    }
                }
            },
            "required": [
                "groups"
            ],
            "title": "Schema"
        },
        "Group": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "name": {
                    "type": "string",
                    "maxLength": 20
                },
                "users": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/User"
                    }
                }
            },
            "required": [
                "name",
                "users"
            ],
            "title": "Group"
        },
        "User": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "name": {
                    "type": "string",
                    "maxLength": 20
                }
            },
            "required": [
                "name"
            ],
            "title": "User"
        }
    }
}
  

Ответ №1:

Вы можете создать определение для нового строкового типа, а затем повторно использовать его с $ref :

   "definitions": {
    "short_string": {
      "type": "string",
      "maxLength": 20
    },
    ...
  },
  "properties": {
    "name": { "$ref": "#/definitions/short_string" },
    ...
  }
  

Комментарии:

1.Спасибо за ваш ответ! Это сработало. Поскольку я отредактировал свой вопрос, тот же номер используется в reducer . Есть ли какой-либо способ импортировать число извне в json? Я обнаружил, что нет причин использовать json. Теперь я просто импортирую объект const схемы. Похоже ли это на лучший способ? import { MAX_STRING_LENGTH } from '../consts' export const schema = {...}

Ответ №2:

Я нашел способ импортировать объект вместо файла json. Легко поместить переменную в объект.

 import Ajv from 'ajv'
import { schema } from './schema'

export const isValid = ( importedJson ) => {
  const ajv = new Ajv()

  return ajv.validate( schema, importedJson )
}
  
 // schema.js
import { MAX_STRING_LENGTH } from '../consts'

export const schema = {
    "$ref": "#/definitions/Schema",
    "definitions": {
        "Schema": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "groups": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/Group"
                    }
                }
            },
            "required": [
                "groups"
            ],
            "title": "Schema"
        },
        "Group": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "name": {
                    "type": "string",
                    "maxLength": MAX_STRING_LENGTH
                },
                "users": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/User"
                    }
                }
            },
            "required": [
                "name",
                "users"
            ],
            "title": "Group"
        },
        "User": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "name": {
                    "type": "string",
                    "maxLength": MAX_STRING_LENGTH
                }
            },
            "required": [
                "name"
            ],
            "title": "User"
        }
    }
}