xref: /aosp_15_r20/external/json-schema-validator/doc/quickstart.md (revision 78c4dd6aa35290980cdcd1623a7e337e8d021c7c)
1*78c4dd6aSAndroid Build Coastguard Worker## Quick Start
2*78c4dd6aSAndroid Build Coastguard Worker
3*78c4dd6aSAndroid Build Coastguard WorkerTo use the validator, we need to have the `JsonSchema` loaded and cached.
4*78c4dd6aSAndroid Build Coastguard Worker
5*78c4dd6aSAndroid Build Coastguard WorkerFor simplicity the following test loads a schema from a `String` or `JsonNode`. Note that loading a schema in this manner is not recommended as a relative `$ref` will not be properly resolved as there is no base IRI.
6*78c4dd6aSAndroid Build Coastguard Worker
7*78c4dd6aSAndroid Build Coastguard WorkerThe preferred method of loading a schema is by using a `SchemaLocation` and by configuring the appropriate `SchemaMapper` and `SchemaLoader` on the `JsonSchemaFactory`.
8*78c4dd6aSAndroid Build Coastguard Worker
9*78c4dd6aSAndroid Build Coastguard Worker```java
10*78c4dd6aSAndroid Build Coastguard Workerpackage com.example;
11*78c4dd6aSAndroid Build Coastguard Worker
12*78c4dd6aSAndroid Build Coastguard Workerimport static org.junit.jupiter.api.Assertions.assertEquals;
13*78c4dd6aSAndroid Build Coastguard Worker
14*78c4dd6aSAndroid Build Coastguard Workerimport java.util.Set;
15*78c4dd6aSAndroid Build Coastguard Worker
16*78c4dd6aSAndroid Build Coastguard Workerimport org.junit.jupiter.api.Test;
17*78c4dd6aSAndroid Build Coastguard Worker
18*78c4dd6aSAndroid Build Coastguard Workerimport com.fasterxml.jackson.core.JsonProcessingException;
19*78c4dd6aSAndroid Build Coastguard Workerimport com.fasterxml.jackson.databind.JsonMappingException;
20*78c4dd6aSAndroid Build Coastguard Workerimport com.fasterxml.jackson.databind.JsonNode;
21*78c4dd6aSAndroid Build Coastguard Workerimport com.networknt.schema.*;
22*78c4dd6aSAndroid Build Coastguard Workerimport com.networknt.schema.serialization.JsonMapperFactory;
23*78c4dd6aSAndroid Build Coastguard Worker
24*78c4dd6aSAndroid Build Coastguard Workerpublic class SampleTest {
25*78c4dd6aSAndroid Build Coastguard Worker    @Test
26*78c4dd6aSAndroid Build Coastguard Worker    void schemaFromString() throws JsonMappingException, JsonProcessingException {
27*78c4dd6aSAndroid Build Coastguard Worker        JsonSchemaFactory factory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V4);
28*78c4dd6aSAndroid Build Coastguard Worker        /*
29*78c4dd6aSAndroid Build Coastguard Worker         * This should be cached for performance.
30*78c4dd6aSAndroid Build Coastguard Worker         *
31*78c4dd6aSAndroid Build Coastguard Worker         * Loading from a String is not recommended as there is no base IRI to use for
32*78c4dd6aSAndroid Build Coastguard Worker         * resolving relative $ref.
33*78c4dd6aSAndroid Build Coastguard Worker         */
34*78c4dd6aSAndroid Build Coastguard Worker        JsonSchema schemaFromString = factory
35*78c4dd6aSAndroid Build Coastguard Worker                .getSchema("{\"enum\":[1, 2, 3, 4],\"enumErrorCode\":\"Not in the list\"}");
36*78c4dd6aSAndroid Build Coastguard Worker        Set<ValidationMessage> errors = schemaFromString.validate("7", InputFormat.JSON);
37*78c4dd6aSAndroid Build Coastguard Worker        assertEquals(1, errors.size());
38*78c4dd6aSAndroid Build Coastguard Worker    }
39*78c4dd6aSAndroid Build Coastguard Worker
40*78c4dd6aSAndroid Build Coastguard Worker    @Test
41*78c4dd6aSAndroid Build Coastguard Worker    void schemaFromJsonNode() throws JsonMappingException, JsonProcessingException {
42*78c4dd6aSAndroid Build Coastguard Worker        JsonSchemaFactory factory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V4);
43*78c4dd6aSAndroid Build Coastguard Worker        JsonNode schemaNode = JsonMapperFactory.getInstance().readTree(
44*78c4dd6aSAndroid Build Coastguard Worker                "{\"$schema\": \"http://json-schema.org/draft-06/schema#\", \"properties\": { \"id\": {\"type\": \"number\"}}}");
45*78c4dd6aSAndroid Build Coastguard Worker        /*
46*78c4dd6aSAndroid Build Coastguard Worker         * This should be cached for performance.
47*78c4dd6aSAndroid Build Coastguard Worker         *
48*78c4dd6aSAndroid Build Coastguard Worker         * Loading from a JsonNode is not recommended as there is no base IRI to use for
49*78c4dd6aSAndroid Build Coastguard Worker         * resolving relative $ref.
50*78c4dd6aSAndroid Build Coastguard Worker         *
51*78c4dd6aSAndroid Build Coastguard Worker         * Note that the V4 from the factory is the default version if $schema is not
52*78c4dd6aSAndroid Build Coastguard Worker         * specified. As $schema is specified in the data, V6 is used.
53*78c4dd6aSAndroid Build Coastguard Worker         */
54*78c4dd6aSAndroid Build Coastguard Worker        JsonSchema schemaFromNode = factory.getSchema(schemaNode);
55*78c4dd6aSAndroid Build Coastguard Worker        /*
56*78c4dd6aSAndroid Build Coastguard Worker         * By default all schemas are preloaded eagerly but ref resolve failures are not
57*78c4dd6aSAndroid Build Coastguard Worker         * thrown. You check if there are issues with ref resolving using
58*78c4dd6aSAndroid Build Coastguard Worker         * initializeValidators()
59*78c4dd6aSAndroid Build Coastguard Worker         */
60*78c4dd6aSAndroid Build Coastguard Worker        schemaFromNode.initializeValidators();
61*78c4dd6aSAndroid Build Coastguard Worker        Set<ValidationMessage> errors = schemaFromNode.validate("{\"id\": \"2\"}", InputFormat.JSON);
62*78c4dd6aSAndroid Build Coastguard Worker        assertEquals(1, errors.size());
63*78c4dd6aSAndroid Build Coastguard Worker    }
64*78c4dd6aSAndroid Build Coastguard Worker}
65*78c4dd6aSAndroid Build Coastguard Worker```
66