Данный проект представляет собой редактор JSON на основе antd, который позволяет использовать ограничения JSON Schema. Он ориентирован на редактирование JSON и поддерживает различные функции JSON Schema, включая сложные комбинации. В отличие от других подобных продуктов, он поддерживает вложенные структуры oneOf/anyOf и комбинированные функции $ref, а также поддерживает множество вариантов использования различных функций.
Как обычно, сначала выполните npm install
:
npm install json-schemaeditor-antd
Затем импортируйте его в свой jsx:
const JsonSchemaEditor, { metaSchema } = 'json-schemaeditor-antd'
// metaSchema is the meta mode, if you don't need to use the meta mode to edit the Json Schema, you can skip importing it
<JsonSchemaEditor data={data} schema={schema}
onChange={(jsonData) => {
console.log(jsonData)
}}
/>
Компонент имеет три свойства: data, schema и onChange: (value: any) => void.
Используйте его как контролируемый компонент. Если вам нужен пакет в формате umd, вы можете импортировать json-schemaeditor-antd/dist
.
Обратите внимание:
Убедитесь, что установлены все необходимые зависимости. Вы можете проверить это непосредственно в файле package.json проекта.
При использовании, если schema ts выдаёт ошибку, добавьте as any после неё, и всё будет в порядке. Вы должны самостоятельно убедиться в правильности схемы перед использованием. Этот проект использует ajv для проверки и подтверждения схемы. Если в схеме есть проблемы, вы увидите окно с ошибкой, и редактор будет отображаться без схемы.
Я провёл первоначальное расследование и обнаружил несколько причин:
- Для поля type значение JSONSchema6TypeName является допустимым значением типа перечисления в JSON Schema. Обычно импортированный json определяет поле type как тип string, а не значение перечисления (хотя json действительно соответствует), и выдаёт ошибку.
Изменения состояния соответствуют соглашению о неизменности.
Я новичок в разработке фронтенда, и это мой первый опыт упаковки и загрузки npm. Возможно, при реальном использовании возникнет много проблем.
Если вы обнаружите ошибки в этом проекте или у вас есть какие-либо предложения или обнаружите недостатки в дизайне, пожалуйста, не стесняйтесь создавать issue! Я постараюсь решить их как можно скорее.
Компонент Editor предоставляет глобальный контекст ctx через useImperativeHandle.
Вы можете получить доступ к хранилищу redux через ctx.store;
Вы можете выполнять действия для изменения данных через ctx.executeAction(type, params);
Функции и параметры, связанные с ctx, можно найти в src/JsonSchemaEditor/context/index.ts.
Для получения дополнительной информации о доступных действиях см. раздел Reducer.
Каждый компонент поля имеет атрибут id, соответствующий ему, через который можно получить корневой элемент dom этого поля. Например, rootdata.user.abc[1] имеет идентификатор user.abc.1.
Обратите внимание:
В большинстве случаев вам не нужно ничего настраивать.
idPerfix, defaultValueFunction,
Это поле используется для указания значения по умолчанию для функции, определённой редактором. Вы также можете указать их в конкретном поле схемы, чтобы переопределить значения по умолчанию, установленные схемой.
displaydesc, notinautofill
Может ли элемент массива быть перемещён. Даже если установлено значение true, перетаскивание ограничено элементами в схеме.
type: boolean
default: true
denseGrid,
JSON Schema — это рекурсивная грамматика, которая описывает, какими свойствами должен обладать файл JSON. В этом проекте используется версия спецификации draft6.
Введение в JSON Schema - Zhihu (zhihu.com)
Далее кратко описывается определение JSON Schema и различия между ним и этим редактором:
Ключевое слово | Функция | Тип значения | Примечание |
---|---|---|---|
title , description
|
Имя переменной, которое отображается в переменных (если переменная является полем объекта, она будет перекрывать имя свойства). Для фактического влияния атрибута title в редакторе см. | string | |
type |
Тип переменной (число, целое число, ноль, массив, объект, логическое значение, строка) | string | |
enum |
Ограничение значения переменной одним из значений перечисления. Перечисление может быть представлено в виде раскрывающегося списка или переключателя | <type>[] | |
const |
Уникальная переменная | <type> | |
$ref |
Ссылка на другую схему. Дополнительная информация, определённая здесь, будет перекрывать ссылку | uri->schema | |
oneOf /anyOf
|
Режим, которому должна соответствовать переменная, должен соответствовать только одному / хотя бы одному из них. В проекте рассматривается вопрос выбора соответствующего режима. | schema[] | |
default |
Значение по умолчанию для переменной. Используется при генерации | <type> | Дополнительные функции |
Примечание: если схема имеет логическое значение, то она напрямую соответствует определению того, действительна ли переменная. true
или {}
— любое значение действительно. false
или {"not": {}}
— любое значение недействительно.
null не нужно отображать.
Ключевое слово | Функция | Тип значения | Примечание |
---|---|---|---|
mininum , maxinum , exclusiveMinimum , exclusiveMaximum
|
Минимальное/максимальное значение числа. exclusive означает «не включая это значение» |
number | |
multipleOf |
Только для целых чисел, может быть разделено на | int |
https://json-schema.org/draft/2020-12/json-schema-validation.html#rfc.section.6.3
Ключевое слово | Функция | Тип значения | Примечание |
---|---|---|---|
minLength , maxLength
|
Минимальная/максимальная длина | int | |
pattern |
Соответствующее регулярное выражение | regex | |
format |
Формат, который является регулярным выражением | string |
type
— «массив».
https://json-schema.org/draft/2020-12/json-schema-validation.html#rfc.section.6.4
Ключевое слово | Функция | Тип значения | Примечание |
---|---|---|---|
items |
Если это схема, считается, что каждый элемент массива соответствует этому режиму. Если это схема[], считается, что элементы массива соответствуют соответствующему режиму индекса от начала до конца. После сопоставления с prefixItems индекс начинает сопоставляться | схема|схема[] | 2020–12 стал дополнительной функцией, используйте prefixItems вместо |
additionalItems |
Когда items установлен в массив, это относится к массиву, только когда элемент установлен в массив. Если режим, то этот режим проверяется после элементов массива. Если false, другие элементы приведут к сбою проверки | схема | |
minItems , maxItems
|
Длина минимальная/максимальная | int | |
contains |
Массив должен содержать элемент, соответствующий этому режиму. Не влияет на предыдущие ключевые слова. Этот ключевой слово используется только для проверки. Создайте другое описание | схема | |
minContains , maxContains
|
Ограничьте количество элементов, соответствующих режиму contains . |
int | 6 нет |
Оптимизация короткого массива:
Если все возможные элементы массива items являются только строкой/числом/логическим значением/нулем, и строка не использует длинный режим, массив будет использовать список коротких режимов для уменьшения пространства отображения и оптимизации.
Ключевое слово | Функция | Тип значения | Примечание |
---|---|---|---|
properties |
Возможные атрибуты поля и информация о переменных поля. Представлен в форме ключ-значение | object<string, схема> | |
patternProperties |
Считается, что атрибут соответствует регулярному выражению, а атрибут проверяется в соответствии со значением режима | объект<регулярное выражение, схема> | |
additionalProperties |
Проверяйте только атрибуты, которые не были проверены properties и patternProperties , соответствуют ли они режиму значения. Например, этот атрибут равен false, что означает, что другие атрибуты (не установлены в true) не допускаются |
схема | |
propertyNames |
Все имена атрибутов объекта должны соответствовать этому режиму | схема | |
required |
Список обязательных полей объекта. По умолчанию в порядке | string[] | |
minProperties , maxProperties
|
Ограничить количество атрибутов | int | |
dependencies |
Указывает, что определённый атрибут может существовать только тогда, когда существует ключевой атрибут. Если значение равно string[] , атрибут имени свойства в массиве существует, и ключевой атрибут может существовать. Если значение равно схеме, весь набор данных должен соответствовать этой схеме, чтобы ключевой атрибут мог существовать |
объект<строка,строка[]> | схема<строка, схема> не реализована |
Схема определяет вложенный объект, чтение атрибутов — root.layer1.layer2
, но чтение соответствующей схемы — root.properties.layer1.properties.layer2
. Каждый слой атрибутов добавляет один слой properties
.
В дизайне по умолчанию есть только обязательные атрибуты, затем выберите дополнительные атрибуты в поле выбора. Атрибуты могут быть добавлены позже. dependencies
не устанавливает никаких специальных настроек для атрибутов выбора, а просто запрещает выбор недоступных атрибутов.
Проверка не конфликтует.
Что касается встраивания схемы в пользовательский интерфейс, это позволяет поддерживать согласованность. Однако, учитывая использование других схем пользовательского интерфейса, я считаю, что схемы пользовательского интерфейса не должны использоваться вместе. JSON Schema: версии и их различия
Версии широко используемой JSON Schema можно найти на сайтах:
Согласно спецификации, в настоящее время широко используются следующие версии: 2020-12, 2019-09, draft-07, draft-06, draft-04.
Вот таблица совместимости версий:
Версия | Совместимость с предыдущей версией | Ссылка на миграцию | Примечание |
---|---|---|---|
draft-04 | / | ||
draft-06 | Нет | JSON Schema Draft-06 Release Notes (json-schema.org) | |
draft-07 | Да | JSON Schema Draft-07 Release Notes (json-schema.org) | |
2019-09 | Нет | JSON Schema 2019-09 Release Notes (json-schema.org) | |
2020-12 | Нет | JSON Schema 2020-12 Release Notes (json-schema.org) |
По умолчанию приложение поддерживает draft 6 и draft 7 как используемые схемы. Для более старых схем, таких как draft 4, необходимо использовать инструменты, такие как ajv-cli, для преобразования в более новые версии схем.
В демоверсии $schema.eslint.json — это схема, преобразованная из draft 7.
Однако редактор не предоставляет автоматического способа перехода к более новым версиям схем (хотя в будущем такая возможность может появиться).
Концепция дизайна
Гипотезы о шаблонах
Редактор использует схему для индивидуальной настройки пользовательского интерфейса, но чтобы этот процесс работал должным образом, схема должна соответствовать следующим предположениям:
Короткие поля
В разделах «объект» и «массив» многие поля занимают мало места. Если можно определить эти поля с помощью схемы и отобразить их в виде сетки, можно значительно повысить эффективность использования пространства. Такие поля называются короткими полями. Вот критерии определения коротких полей:
Поле должно соответствовать следующим условиям, чтобы считаться коротким полем: — только один возможный тип; — нет параметров oneOf/anyOf.
Если поле соответствует этим условиям, оно считается коротким полем, если удовлетворяет следующим правилам:
Короткие поля могут быть плотно размещены в виде сетки в объектах и массивах, что позволяет использовать меньше места для отображения по сравнению с длинными полями и повышает эффективность использования экрана.
Операционное пространство для коротких полей находится в правой части кнопок. При нажатии кнопки можно выбрать операцию и выполнить её.
Можно доказать, что все вложенные форматы, кроме enum/const/настраиваемых компонентов view, являются длинными полями.
Обратите внимание, что настраиваемые компоненты view...
Операционное пространство (операции, которые можно выполнять)
Здесь перечислены не все операции, а только некоторые из них. Некоторые операции не являются универсальными, например создание и переименование. Подробности смотрите по ссылкам.
Копирование и вставка (в разработке)
В режиме списка можно скопировать несколько элементов (создать массив) и вставить их в список по очереди.
При вставке выполняется поверхностная проверка.
Отмена и возврат
Это просто операции отмены и возврата. Однако для их реализации требуется хорошее понимание React и Redux!
Поверхностная проверка
Схема выполняет простую и быструю проверку данных. По сравнению со всей схемой проверки она занимает меньше времени. Вот как это работает:
Примечание: поверхностная проверка не проверяет поля, определённые как oneOf/anyOf, и сразу возвращает true.
Интерфейс компонента
Каждому полю соответствует компонент Field. Фактический компонент, используемый для отображения поля, определяется функцией getEditComponent.
Фактический компонент может выполнять следующие операции через интерфейс IField: — получить путь к полю; — получить данные поля; — получить объединённую схему поля.
Дополнительная информация
ajv и его конфигурация
Этот редактор использует ajv для проверки достоверности, но на основе конфигурации ajv по умолчанию добавлены следующие настройки: — добавлены методы проверки некоторых форматов с помощью ajv.addFormat(); — добавлены будущие соединения (не реализованы).
Шаблоны для шаблонов — меташаблоны
Описание схемы JSON называется меташаблоном. Меташаблон используется для проверки правильности схемы JSON.
Проект использует шаблон draft6 в качестве меташаблона, но для удобства редактирования проект расширяет меташаблон и добавляет некоторые общие соглашения с некоторыми ограничениями. Смотрите экспортированный metaSchema.
Внимание к нескольким схемам
В некоторых случаях необходимо проверить данные с использованием нескольких схем. Это происходит в следующих ситуациях: — используется $ref; — одно свойство соответствует свойствам и patternProperties; — oneOf, anyOf, allOf.
Настройка редактора заключается в том, что каждый шаблонный вход ссылается на шаблонное отображение в виде карты ($ref, schemaInfo), хранящейся в контексте редактора ctx.
Предположение о замене
Когда дело доходит до нескольких объектов схемы, результатом проверки схемы является объединение результатов проверки всех связанных схем (с использованием логического оператора «и»).
Для шаблона, который имеет $ref и связан с несколькими объектами схемы, предполагается, что его поведение такое же, как если бы связанные схемы были объединены. Объединение выполняется с использованием object.assign, где свойства $ref заменяются свойствами связанного шаблона.
Если вы используете шаблон с $ref, который связан с несколькими шаблонами, и эти шаблоны имеют одинаковые или разные свойства проверки, результаты будут отличаться от тех, которые соответствуют предположению о замене.
Обычно, если вы не делаете это намеренно, вы не будете этого делать.
Что касается шаблонов с $ref, лучше всего, чтобы $ref не включал никаких свойств проверки. Самое большее, что вы можете сделать, это включить свойства title и description для замены значений этих свойств в связанном шаблоне.
Исключением из предположения о замене в редакторе является поддержка пользовательского интерфейса: свойства и patternProperties не заменяют друг друга. Если корневой узел в схеме определён как массив и его фактический тип также является массивом, то данные будут отображаться в виде двухколоночного списка. В левой колонке можно перетащить и выбрать несколько элементов для копирования и вставки. (Пока не реализовано).
https://ajv.js.org/packages/ajv-formats.html
Примечание: некоторые форматы специализированных компонентов редактирования ещё не реализованы, но проверка всё равно работает.
В формате строки format
устанавливается. Кроме того, были добавлены другие форматы:
Формат | Описание | Тип формата | Специальный компонент |
---|---|---|---|
uri | longFormats |
||
uri-reference | longFormats |
||
base-64 | extraLongFormats |
двоичный редактор (не реализован) | |
color | цвет. поддержка rgb/rgba/cmyk и других форматов цвета? | палитра цветов (не реализована) | |
row | однострочный ввод с увеличенной длиной, без проверки | longFormats |
ввод с увеличенной длиной |
multiline | многострочный ввод, без проверки | extraLongFormats |
|
code:<language> | код конкретного языка (не реализован) | extraLongFormats |
monaco-editor (не реализован) |
file:<file-type> | имя файла (не реализовано) | окно загрузки файлов (не реализовано), но файлы будут прочитаны и отображены, например, изображения, хотя они и не реализованы |
Некоторые форматы строк не поддерживают оптимизацию по длине, поэтому они отображаются как длинные компоненты. Длинные форматы делятся на две категории: однострочные длинные форматы longFormats
и многострочные длинные форматы extraLongFormats
.
Однострочные длинные форматы по-прежнему отображаются в одной строке, но длина увеличивается. Многострочные длинные форматы отображаются на новой строке и могут занимать несколько строк.
На данный момент существует проблема с форматами:
Проверка формата может быть функцией или регулярным выражением. Честно говоря, формат, помимо того, что он делает, должен быть переопределён. Формат должен иметь функцию проверки и значение по умолчанию. Зачем нужно значение по умолчанию? Если у вас есть поле с
oneOf
, каждый вариант соответствует определённому формату строки. Если вы переключаетесь, а формат по умолчанию не установлен, вы теряете данные. Замена пустой строкой не поможет вам определить, какой элемент был выбран.
В схеме можно использовать view через поле view:
{
"view": {
"type": "your_view_type",
"params": {
"any": "any"
}
}
}
Можно создать собственный компонент json-schemaeditor и опубликовать его в npm. Таким образом, при использовании json-schemaeditor можно использовать пользовательские компоненты view, настроив файл конфигурации json-schemaeidtor.json
(использовать ли json-пакет или требовать js).
Примечание: пользовательские компоненты вида отличаются от пользовательских компонентов формата строки тем, что они не ограничиваются использованием в строковом типе.
Пользовательские компоненты вида должны быть настроены следующим образом:
{
"type": "your_view_type"
}
Затем добавьте некоторые соглашения о каталогах...
Компоненты редактора используют useImperativeHandle
для раскрытия хранилища, которое можно получить и напрямую отправить действие для изменения. Ниже описаны основные действия:
// Пример: добавление поля 1 в подарки со значением { "name": "gold", "number": 10 }
const action = {
type: 'create',
route: ['gifts'],
field: '1',
value: {
name: 'gold',
number: 10
}
}
Для компонента Field доступ к себе осуществляется через access
, доступ к родительскому элементу — через route
, а доступ к дочернему элементу — через access+sfield
.
Возможные действия | Обновление | Описание |
---|---|---|
create(access+sfield) | access,+sfield | Создание нового свойства в access |
change(route,field) | field | Изменение собственного значения |
delete(route, field) | route | Удаление себя из родительского элемента |
rename(route, field) | route,field | Изменение имени собственного атрибута |
moveup/down(route, field) | route, field | Перемещение себя вверх или вниз |
setdata(value) | Прямое обновление | |
undo/redo | Отмена/повтор |
Обратите внимание, что после отправки действия в reducer выполняется только проверка того, можно ли выполнить действие непосредственно на уровне json, но не проверка на уровне схемы. Если действие, отправленное в reducer, не может быть выполнено, будет выведено сообщение об ошибке.
Текущее тестирование проекта (модульное тестирование, интеграционное тестирование и т. д.) не завершено, оно охватывает только основной поток и имеет покрытие около 70%.
Мы постараемся исправить это как можно скорее.
После последнего обновления npm этот проект использует dumi в качестве среды разработки.
Хотя dumi также имеет некоторые недостатки, он всё ещё является надёжным решением для разработки библиотек компонентов.
Этот проект не упаковывает antd, а использует собственные зависимости antd.
antd можно упростить с помощью babel, и этот проект использовал эту функцию. Однако по неизвестной причине (возможно, из-за конфигурации упаковки, но она не была тщательно исследована), импорт пакета проекта не загружает css-файл antd вместе, необходимо вручную загрузить полный
antd.css
, чтобы применить стили (если используется umi или аналогичные фреймворки, фреймворк автоматически загрузит его за вас).
Кроме того, используемый в проекте antd зависит от используемого вами antd темы. При разработке использовалась компактная тема.
При тестировании проекта можно нормально импортировать и применять этот компонент в среде umi.
Запишите конфигурацию для индивидуальной разработки, которая может служить ориентиром при возникновении проблем.
v0.1.4 до: os: windows 11 nodejs v14.18.0 npm v6.14.15
v0.1.4: os: windows 11 nodejs v16.14.2 npm v8.5.0
Здесь можно свободно выражать свои мысли, но всё, что можно сделать, можно сделать. Можно ли реализовать или никогда не узнать.
[npm-image] [npm-url] [quality-image] [quality-url] [node-url] [download-image] [download-url]
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )