Referencing a local relative file in a JSON Schema?

24,942

Solution 1

What you need there is being able to reference your files using an absolute URI.

Supposing you are using the stable version (ie 2.0.2), load your schema using this method.

Given where your file is located, use:

final JsonSchema schema 
    = factory.getJsonSchema("resource:/json/schema/MySchema.schema.json");

This means URI resolution in this schema will be made relatively to this (loading) URI; so, refering to your MyBoolean.json, you will do:

{
    "$ref": "MyBoolean.json#/pointer/into/file"
}

If it is located at, for instance, /json/schema/subschemas then you will write:

{
    "$ref": "subschemas/MyBoolean.json#/pointer/into/file"
}

Parents also work etc.


Note that as noted in the README, 2.1.x is a development version! I am currently reworking the API...

Solution 2

The following solution worked for me. The path is relative to location where I run mvn goals.

"items": {
                "type": "object",
                "$ref": "file:src/xyz/abc/lmn/DeviceRecord.json"
         }

Here file: is the path from where you are executing the maven goal.

Share:
24,942
Sled
Author by

Sled

A Java Developer who has worked at places ranging from a Fortune 100 company to a small start-up. Using Java for over 20 years.

Updated on July 29, 2022

Comments

  • Sled
    Sled over 1 year

    I am building a JSON for a REST web service. The schema however has grown to over 1300 lines and I want to split it up across multiple files. I am unit testing my schema against a folder of JSON sample responses using json-schema-validator version 2.1.8.

    I know you have import types defined in your current file like { "$ref": "#/definitions/MyBool" }, however if I wanted to move the definition of MyBool to another file, like Common.schema.json, how would I reference it then?

    I tried { "$ref": "Common.schema.json/definitions/MyBoolean" }, { "$ref": "./Common.schema.json/defintion/MyBoolean" }, and { "$ref": "file://./Common.schema.json/definitions/MyBoolean" } but none of them work.

    The answer on "Does JSON Schema validation in common-js utils support references?" seems like it should work but I can't seem to get the syntax right.

    I'm loading the schema with:

    JsonNode mySchema = JsonLoader.fromReader(   new InputStreamReader(  JsonSchemaTest.class.getResourceAsStream( "/json/schema/MySchema.schema.json" )  )   );
    

    and then validating it with:

    JsonSchemaFactory.byDefault().getValidator().validate(   schema,   new InputStreamReader(  getClass().getResourceAsStream( "/json/sample/MyJsonSample.json" )  )   ).isSuccess();
    

    FWIW MyBool looks like:

    "MyBool": {
        "type": "object",
        "properties": {
            "value" :{
                "type": "string",
                "enum": [ "true", "false", "file not found" ]
            }
        },
        "required": ["value"],
        "additionalProperties": false
    }
    

    When I don't try to extract MyBool, the schema validates all my JSON samples correctly.


    The exception I receive is:

    com.github.fge.jsonschema.core.exceptions.ProcessingException: fatal: unable to dereference URI "file:/Common.schema.json/definitions/MyBool#"
        level: "fatal"
        uri: "file:/Common.schema.json/definitions/MyBool#"
        exceptionMessage: "\\Common.schema.json\\definitions\\MyBool (The system cannot find the path specified)"
    
        at com.github.fge.jsonschema.core.load.URIManager.getContent(URIManager.java:108)
        at com.github.fge.jsonschema.core.load.SchemaLoader$1.load(SchemaLoader.java:108)
        at com.github.fge.jsonschema.core.load.SchemaLoader$1.load(SchemaLoader.java:103)
        at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3524)
        at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2317)
        at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2280)
        at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2195)
        at com.google.common.cache.LocalCache.get(LocalCache.java:3934)
        at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3938)
        at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4821)
        at com.github.fge.jsonschema.core.load.SchemaLoader.get(SchemaLoader.java:165)
        at com.github.fge.jsonschema.core.load.RefResolver.rawProcess(RefResolver.java:113)
        at com.github.fge.jsonschema.core.load.RefResolver.rawProcess(RefResolver.java:50)
        at com.github.fge.jsonschema.core.processing.RawProcessor.process(RawProcessor.java:76)
        at com.github.fge.jsonschema.core.processing.RawProcessor.process(RawProcessor.java:40)
        at com.github.fge.jsonschema.core.processing.ProcessorChain$ProcessorMerger.process(ProcessorChain.java:188)
        at com.github.fge.jsonschema.core.processing.ProcessingResult.of(ProcessingResult.java:78)
        at com.github.fge.jsonschema.core.processing.CachingProcessor$1.load(CachingProcessor.java:127)
        at com.github.fge.jsonschema.core.processing.CachingProcessor$1.load(CachingProcessor.java:119)
        at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3524)
        at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2317)
        at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2280)
        at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2195)
        at com.google.common.cache.LocalCache.get(LocalCache.java:3934)
        at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3938)
        at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4821)
        at com.github.fge.jsonschema.core.processing.CachingProcessor.process(CachingProcessor.java:108)
        at com.github.fge.jsonschema.processors.validation.ValidationChain.process(ValidationChain.java:106)
        at com.github.fge.jsonschema.processors.validation.ValidationChain.process(ValidationChain.java:55)
        at com.github.fge.jsonschema.core.processing.ProcessorMap$Mapper.process(ProcessorMap.java:165)
        at com.github.fge.jsonschema.core.processing.ProcessingResult.of(ProcessingResult.java:78)
        at com.github.fge.jsonschema.core.processing.CachingProcessor$1.load(CachingProcessor.java:127)
        at com.github.fge.jsonschema.core.processing.CachingProcessor$1.load(CachingProcessor.java:119)
        at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3524)
        at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2317)
        at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2280)
        at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2195)
        at com.google.common.cache.LocalCache.get(LocalCache.java:3934)
        at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3938)
        at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4821)
        at com.github.fge.jsonschema.core.processing.CachingProcessor.process(CachingProcessor.java:108)
        at com.github.fge.jsonschema.processors.validation.ValidationProcessor.process(ValidationProcessor.java:83)
        at com.github.fge.jsonschema.processors.validation.ValidationProcessor.processObject(ValidationProcessor.java:179)
        at com.github.fge.jsonschema.processors.validation.ValidationProcessor.process(ValidationProcessor.java:121)
        at com.github.fge.jsonschema.processors.validation.ValidationProcessor.processArray(ValidationProcessor.java:149)
        at com.github.fge.jsonschema.processors.validation.ValidationProcessor.process(ValidationProcessor.java:119)
        at com.github.fge.jsonschema.processors.validation.ValidationProcessor.processObject(ValidationProcessor.java:179)
        at com.github.fge.jsonschema.processors.validation.ValidationProcessor.process(ValidationProcessor.java:121)
        at com.github.fge.jsonschema.processors.validation.ValidationProcessor.process(ValidationProcessor.java:48)
        at com.github.fge.jsonschema.keyword.validator.draftv4.OneOfValidator.validate(OneOfValidator.java:67)
        at com.github.fge.jsonschema.processors.validation.ValidationProcessor.process(ValidationProcessor.java:100)
        at com.github.fge.jsonschema.processors.validation.ValidationProcessor.process(ValidationProcessor.java:48)
        at com.github.fge.jsonschema.core.processing.ProcessingResult.of(ProcessingResult.java:78)
        at com.github.fge.jsonschema.main.JsonValidator.validate(JsonValidator.java:103)
        at com.github.fge.jsonschema.main.JsonValidator.validate(JsonValidator.java:123)
        at com.initech.ws.json.BaseJsonSchemaTest.jsonFileShouldValidate(BaseJsonSchemaTest.java:84)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
        at org.junit.runners.Suite.runChild(Suite.java:127)
        at org.junit.runners.Suite.runChild(Suite.java:26)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
        at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
        at org.junit.runners.Suite.runChild(Suite.java:127)
        at org.junit.runners.Suite.runChild(Suite.java:26)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
        at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74)
        at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)
        at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
    
  • Sled
    Sled over 6 years
    but then when you go to deploy your schema on a web server the wouldn't the file: protocol cause problems?