blob: d5cab0b980087c5fd565af008c9a3385aa12cc11 [file] [log] [blame] [view]
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 youve 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();
}
```