Skip to content

Understanding the Generated JSON Schema

Alexey Valikov edited this page May 2, 2015 · 18 revisions

Understanding the generated JSON Schema

If you've turned on the JSON Schema generation, Jsonix Schema Compiler will produce one more JSON Schema files for each your modules according to the configuration.

Single-mapping module

We'll start with a single-maping module, that is, a module which contains just one mapping (see Modules and Mappings for more information).

The JSON Schema for a single-mapping module will contain:

  • the id of the schema (see Mapping Configuration);
  • the definitions sections which declares complex and enum types;
  • the anyOf section which lists possible top-level elements as qualified name/expected value type pair.

Here's what it looks like:

{
    "id":"MyMapping.jsonschema#",
    "definitions":{
        "MyComplexType":{ "type":"object", ... },
        "MyEnumType":{ "type":"string", ... },
        ...
    },
    "anyOf":[
        {
            "type":"object",
            "properties":{
                "name":{
                    "$ref":"http://www.jsonix.org/jsonschemas/w3c/2001/XMLSchema.jsonschema#/definitions/QName"
                },
                "value":{
                    "$ref":"#/definitions/MyComplexType"
                }
            },
            "elementName":{
                "localPart":"myComplexElement",
                "namespaceURI":""
            }
        },
        ...
    ]
}

Mapping schema id

The id of the mapping schema is generated based on the Mapping Configuration (see the schemaId attribute). By default this will be ${mapping.targetNamespace}#. For example, for the XLink 1.0 XML Schema you'll get http://www.w3.org/1999/xlink# as JSON Schema id, but you may also configure your own value.

The schema id is important as it will be used to refer to that schema using the $ref property (see [the specification](http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-030 for more information).

Multi-mapping module

If the module contains several mappings, it's structure will be a bit more complex:

  • the module schema will get its own schema id (see Module Configuration);
  • the definitions sections will contain schemas for individual mappings;
  • the anyOf section will refer to the schemas of the individual mappings via $ref - id.

Here's what it looks like:

{
    "id":"A_B.jsonschema#",
    "definitions":{
        "A":{"id":"A.jsonschema#", "definitions" : {...}, "anyOf" : [ ... ]},
        "B":{"id":"B.jsonschema#", "definitions" : {...}, "anyOf" : [ ... ]}
    },
    "anyOf":[
        { "$ref":"A.jsonschema#" },
        { "$ref":"B.jsonschema#" }
    ]
}

Module schema id

Module schema gets its own identifier. By default this is ${module.name}.jsonschema#, so you'll get a schema id A_B.jsonschema# for the module named A_B. Module schema id is also configurable.

Clone this wiki locally