#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"
}
}
}