Validation
Whenever you change data in the forms generated by JSON Forms, it will be validated in the background in order to display any messages that violate the JSON schema.
Validation is handled by AJV and can be customized by passing a custom AJV instance as a prop to the JsonForms
standalone component.
If you do not customize the validator, a default instance will be created for you. That default instance is configured as follows:
import Ajv from 'ajv';
import addFormats from 'ajv-formats';
const ajv = new AJV({
allErrors: true,
verbose: true,
strict: false,
...options,
});
addFormats(ajv);
You can either create your own instance or you can use the createAjv
function provided by JSON Forms that allows overriding the default options by passing in additional options.
For customizing or localizing AJV error messages we recommend ajv-errors.
ValidationMode
There are three different validation modes:
ValidateAndShow
: Validates, emits and shows errors (which is the default)ValidateAndHide
: Validates and emits errors, but does not show themNoValidation
: Does not validate at all
You can set the validation mode in each JSON Form's root component. For example in React it could look like this:
<JsonForms
schema={schema}
uischema={uischema}
data={data}
renderers={materialRenderers}
cells={materialCells}
validationMode={currentValidationMode}
/>
Here you can see the different modes in action
Current validation mode: ValidateAndShow
Emitted errors:
External Validation Errors
External errors (e.g. coming from a backend) can be supplied to the form via the additionalErrors
prop. These errors are mixed in with the regular errors coming from the AJV validation.
Whenever the external errors change, the prop needs to be updated. However, to avoid unnecessary rerenderings, it should be stable or memoized.
The additionalErrors
are an array of type ErrorObject
from AJV.
The easiest way to declare an error for a property is by specifying the instancePath
, which represents the path of the property in the schema,
and a message
string which will be used to display the error in the form.
const AdditionalErrorsExample = () => {
const [additionalErrors, setAdditionalErrors] = useState<ErrorObject[]>([]);
const addAdditionalError = () => {
const newError: ErrorObject = {
// AJV style path to the property in the schema
instancePath: '/lastname',
// message to display
message: 'New error',
schemaPath: '',
keyword: '',
params: {},
};
setAdditionalErrors(errors => [...errors, newError]);
};
return (
<div>
<JsonForms
schema={schema}
uischema={uischema}
data={formData}
renderers={materialRenderers}
cells={materialCells}
additionalErrors={additionalErrors}
/>
<Button onClick={addAdditionalError} >
Add Additional Error
</Button>
</div>
);
};
Note that the validationMode
property has no effect on additionalErrors
, so even when handing over NoValidation
or ValidateAndHide
, the additional errors will still be shown.
Additional errors:
Emitted errors:
Current validation mode: ValidateAndShow