1*78c4dd6aSAndroid Build Coastguard WorkerThis document lists all the validators supported and gives users are guideline on how to use them. 2*78c4dd6aSAndroid Build Coastguard Worker 3*78c4dd6aSAndroid Build Coastguard Worker### if-then-else 4*78c4dd6aSAndroid Build Coastguard Worker 5*78c4dd6aSAndroid Build Coastguard Worker* Specification(s): draft7 6*78c4dd6aSAndroid Build Coastguard Worker* Contributor(s): @andersonf 7*78c4dd6aSAndroid Build Coastguard Worker* Reference: https://json-schema.org/understanding-json-schema/reference/conditionals.html 8*78c4dd6aSAndroid Build Coastguard Worker* Issues and PRs: https://github.com/networknt/json-schema-validator/pull/206 9*78c4dd6aSAndroid Build Coastguard Worker 10*78c4dd6aSAndroid Build Coastguard WorkerThe `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. 11*78c4dd6aSAndroid Build Coastguard Worker 12*78c4dd6aSAndroid Build Coastguard WorkerIf `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). 13*78c4dd6aSAndroid Build Coastguard Worker 14*78c4dd6aSAndroid Build Coastguard WorkerFor 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 15*78c4dd6aSAndroid Build Coastguard Worker 16*78c4dd6aSAndroid Build Coastguard Worker### Custom Validators 17*78c4dd6aSAndroid Build Coastguard Worker````java 18*78c4dd6aSAndroid Build Coastguard Worker@Bean 19*78c4dd6aSAndroid Build Coastguard Workerpublic JsonSchemaFactory mySchemaFactory() { 20*78c4dd6aSAndroid Build Coastguard Worker // base on JsonMetaSchema.V201909 copy code below 21*78c4dd6aSAndroid Build Coastguard Worker String URI = "https://json-schema.org/draft/2019-09/schema"; 22*78c4dd6aSAndroid Build Coastguard Worker String ID = "$id"; 23*78c4dd6aSAndroid Build Coastguard Worker List<Format> BUILTIN_FORMATS = new ArrayList<Format>(JsonMetaSchema.COMMON_BUILTIN_FORMATS); 24*78c4dd6aSAndroid Build Coastguard Worker 25*78c4dd6aSAndroid Build Coastguard Worker JsonMetaSchema myJsonMetaSchema = new JsonMetaSchema.Builder(URI) 26*78c4dd6aSAndroid Build Coastguard Worker .idKeyword(ID) 27*78c4dd6aSAndroid Build Coastguard Worker .formats(BUILTIN_FORMATS) 28*78c4dd6aSAndroid Build Coastguard Worker .keywords(ValidatorTypeCode.getFormatKeywords(SpecVersion.VersionFlag.V201909)) 29*78c4dd6aSAndroid Build Coastguard Worker // keywords that may validly exist, but have no validation aspect to them 30*78c4dd6aSAndroid Build Coastguard Worker .keywords(Arrays.asList( 31*78c4dd6aSAndroid Build Coastguard Worker new NonValidationKeyword("$schema"), 32*78c4dd6aSAndroid Build Coastguard Worker new NonValidationKeyword("$id"), 33*78c4dd6aSAndroid Build Coastguard Worker new NonValidationKeyword("title"), 34*78c4dd6aSAndroid Build Coastguard Worker new NonValidationKeyword("description"), 35*78c4dd6aSAndroid Build Coastguard Worker new NonValidationKeyword("default"), 36*78c4dd6aSAndroid Build Coastguard Worker new NonValidationKeyword("definitions"), 37*78c4dd6aSAndroid Build Coastguard Worker new NonValidationKeyword("$defs") // newly added in 2018-09 release. 38*78c4dd6aSAndroid Build Coastguard Worker )) 39*78c4dd6aSAndroid Build Coastguard Worker // add your custom keyword 40*78c4dd6aSAndroid Build Coastguard Worker .keyword(new GroovyKeyword()) 41*78c4dd6aSAndroid Build Coastguard Worker .build(); 42*78c4dd6aSAndroid Build Coastguard Worker 43*78c4dd6aSAndroid Build Coastguard Worker return new JsonSchemaFactory.Builder().defaultMetaSchemaIri(myJsonMetaSchema.getIri()) 44*78c4dd6aSAndroid Build Coastguard Worker .metaSchema(myJsonMetaSchema) 45*78c4dd6aSAndroid Build Coastguard Worker .build(); 46*78c4dd6aSAndroid Build Coastguard Worker} 47*78c4dd6aSAndroid Build Coastguard Worker 48*78c4dd6aSAndroid Build Coastguard Workerpublic class GroovyKeyword extends AbstractKeyword { 49*78c4dd6aSAndroid Build Coastguard Worker private static final Logger logger = LoggerFactory.getLogger(GroovyKeyword.class); 50*78c4dd6aSAndroid Build Coastguard Worker 51*78c4dd6aSAndroid Build Coastguard Worker public GroovyKeyword() { 52*78c4dd6aSAndroid Build Coastguard Worker super("groovy"); 53*78c4dd6aSAndroid Build Coastguard Worker } 54*78c4dd6aSAndroid Build Coastguard Worker 55*78c4dd6aSAndroid Build Coastguard Worker @Override 56*78c4dd6aSAndroid Build Coastguard Worker public AbstractJsonValidator newValidator(String schemaPath, JsonNode schemaNode, JsonSchema parentSchema, ValidationContext validationContext) throws JsonSchemaException, Exception { 57*78c4dd6aSAndroid Build Coastguard Worker // you can read validator config here 58*78c4dd6aSAndroid Build Coastguard Worker String config = schemaNode.asText(); 59*78c4dd6aSAndroid Build Coastguard Worker return new AbstractJsonValidator(this.getValue()) { 60*78c4dd6aSAndroid Build Coastguard Worker @Override 61*78c4dd6aSAndroid Build Coastguard Worker public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String at) { 62*78c4dd6aSAndroid Build Coastguard Worker // you can do validate here 63*78c4dd6aSAndroid Build Coastguard Worker logger.info("config:{} path:{} node:{}", config, at, node); 64*78c4dd6aSAndroid Build Coastguard Worker 65*78c4dd6aSAndroid Build Coastguard Worker return Collections.emptySet(); 66*78c4dd6aSAndroid Build Coastguard Worker } 67*78c4dd6aSAndroid Build Coastguard Worker }; 68*78c4dd6aSAndroid Build Coastguard Worker } 69*78c4dd6aSAndroid Build Coastguard Worker} 70*78c4dd6aSAndroid Build Coastguard Worker```` 71*78c4dd6aSAndroid Build Coastguard WorkerYou can use GroovyKeyword like below: 72*78c4dd6aSAndroid Build Coastguard Worker````json 73*78c4dd6aSAndroid Build Coastguard Worker{ 74*78c4dd6aSAndroid Build Coastguard Worker "type": "object", 75*78c4dd6aSAndroid Build Coastguard Worker "properties": { 76*78c4dd6aSAndroid Build Coastguard Worker "someProperty": { 77*78c4dd6aSAndroid Build Coastguard Worker "type": "string", 78*78c4dd6aSAndroid Build Coastguard Worker "groovy": "SomeScript.groovy" 79*78c4dd6aSAndroid Build Coastguard Worker } 80*78c4dd6aSAndroid Build Coastguard Worker } 81*78c4dd6aSAndroid Build Coastguard Worker} 82*78c4dd6aSAndroid Build Coastguard Worker```` 83*78c4dd6aSAndroid Build Coastguard Worker 84*78c4dd6aSAndroid Build Coastguard Worker### Override Email/UUID/DateTime Validator 85*78c4dd6aSAndroid Build Coastguard Worker 86*78c4dd6aSAndroid Build Coastguard WorkerIn this library, if the format keyword is "email", "uuid", "date", "date-time", default validator provided by the library will be used. 87*78c4dd6aSAndroid Build Coastguard Worker 88*78c4dd6aSAndroid Build Coastguard WorkerIf you want to override this behavior, do as below. 89*78c4dd6aSAndroid Build Coastguard Worker 90*78c4dd6aSAndroid Build Coastguard Worker```java 91*78c4dd6aSAndroid Build Coastguard Workerpublic JsonSchemaFactory mySchemaFactory() { 92*78c4dd6aSAndroid Build Coastguard Worker // base on JsonMetaSchema.V201909 copy code below 93*78c4dd6aSAndroid Build Coastguard Worker String URI = "https://json-schema.org/draft/2019-09/schema"; 94*78c4dd6aSAndroid Build Coastguard Worker String ID = "$id"; 95*78c4dd6aSAndroid Build Coastguard Worker 96*78c4dd6aSAndroid Build Coastguard Worker JsonMetaSchema overrideEmailValidatorMetaSchema = new JsonMetaSchema.Builder(URI) 97*78c4dd6aSAndroid Build Coastguard Worker .idKeyword(ID) 98*78c4dd6aSAndroid Build Coastguard Worker // Override EmailValidator 99*78c4dd6aSAndroid Build Coastguard Worker .format(new PatternFormat("email", "^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$")) 100*78c4dd6aSAndroid Build Coastguard Worker .build(); 101*78c4dd6aSAndroid Build Coastguard Worker 102*78c4dd6aSAndroid Build Coastguard Worker return new JsonSchemaFactory.Builder().defaultMetaSchemaIri(overrideEmailValidatorMetaSchema.getIri()) 103*78c4dd6aSAndroid Build Coastguard Worker .metaSchema(overrideEmailValidatorMetaSchema) 104*78c4dd6aSAndroid Build Coastguard Worker .build(); 105*78c4dd6aSAndroid Build Coastguard Worker} 106*78c4dd6aSAndroid Build Coastguard Worker``` 107