| 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<Format> BUILTIN_FORMATS = new ArrayList<Format>(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<ValidationMessage> 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(); |
| } |
| ``` |