xref: /aosp_15_r20/external/json-schema-validator/doc/validators.md (revision 78c4dd6aa35290980cdcd1623a7e337e8d021c7c)
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