This document lists all the validators supported and gives users are guideline on how to use them. ### if-then-else * Specification(s): draft7 * Contributor(s): @andersonf * Reference: https://json-schema.org/understanding-json-schema/reference/conditionals.html * Issues and PRs: https://github.com/networknt/json-schema-validator/pull/206 The `if`, `then` and `else` keywords allow the application of a subschema based on the outcome of another schema, much like the `if/then/else` constructs you’ve probably seen in traditional programming languages. If `if` is valid, `then` must also be valid (and `else` is ignored.) If `if` is invalid, `else` must also be valid (and `then` is ignored). For usage, please refer to the test cases at https://github.com/networknt/json-schema-validator/blob/master/src/test/resources/draft7/if-then-else.json ### Custom Validators ````java @Bean public JsonSchemaFactory mySchemaFactory() { // base on JsonMetaSchema.V201909 copy code below String URI = "https://json-schema.org/draft/2019-09/schema"; String ID = "$id"; List BUILTIN_FORMATS = new ArrayList(JsonMetaSchema.COMMON_BUILTIN_FORMATS); JsonMetaSchema myJsonMetaSchema = new JsonMetaSchema.Builder(URI) .idKeyword(ID) .formats(BUILTIN_FORMATS) .keywords(ValidatorTypeCode.getFormatKeywords(SpecVersion.VersionFlag.V201909)) // keywords that may validly exist, but have no validation aspect to them .keywords(Arrays.asList( new NonValidationKeyword("$schema"), new NonValidationKeyword("$id"), new NonValidationKeyword("title"), new NonValidationKeyword("description"), new NonValidationKeyword("default"), new NonValidationKeyword("definitions"), new NonValidationKeyword("$defs") // newly added in 2018-09 release. )) // add your custom keyword .keyword(new GroovyKeyword()) .build(); return new JsonSchemaFactory.Builder().defaultMetaSchemaIri(myJsonMetaSchema.getIri()) .metaSchema(myJsonMetaSchema) .build(); } public class GroovyKeyword extends AbstractKeyword { private static final Logger logger = LoggerFactory.getLogger(GroovyKeyword.class); public GroovyKeyword() { super("groovy"); } @Override public AbstractJsonValidator newValidator(String schemaPath, JsonNode schemaNode, JsonSchema parentSchema, ValidationContext validationContext) throws JsonSchemaException, Exception { // you can read validator config here String config = schemaNode.asText(); return new AbstractJsonValidator(this.getValue()) { @Override public Set validate(JsonNode node, JsonNode rootNode, String at) { // you can do validate here logger.info("config:{} path:{} node:{}", config, at, node); return Collections.emptySet(); } }; } } ```` You can use GroovyKeyword like below: ````json { "type": "object", "properties": { "someProperty": { "type": "string", "groovy": "SomeScript.groovy" } } } ```` ### Override Email/UUID/DateTime Validator In this library, if the format keyword is "email", "uuid", "date", "date-time", default validator provided by the library will be used. If you want to override this behavior, do as below. ```java public JsonSchemaFactory mySchemaFactory() { // base on JsonMetaSchema.V201909 copy code below String URI = "https://json-schema.org/draft/2019-09/schema"; String ID = "$id"; JsonMetaSchema overrideEmailValidatorMetaSchema = new JsonMetaSchema.Builder(URI) .idKeyword(ID) // Override EmailValidator .format(new PatternFormat("email", "^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$")) .build(); return new JsonSchemaFactory.Builder().defaultMetaSchemaIri(overrideEmailValidatorMetaSchema.getIri()) .metaSchema(overrideEmailValidatorMetaSchema) .build(); } ```