{"id":15013065,"url":"https://github.com/jsonx-org/java","last_synced_at":"2025-05-11T10:26:38.750Z","repository":{"id":41114871,"uuid":"148918310","full_name":"jsonx-org/java","owner":"jsonx-org","description":"Reference implementation of the JSONx specification for the Java platform, including encoding, decoding, processing, validation, and binding.","archived":false,"fork":false,"pushed_at":"2025-01-13T07:45:56.000Z","size":2213,"stargazers_count":49,"open_issues_count":4,"forks_count":14,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-03-31T21:51:29.581Z","etag":null,"topics":["binding","binding-generator","consumer-driven-contracts","enterprise","generator","java","jsd","jsdx","json","json-schema","jsonx","jsonx-schema","schema","validator"],"latest_commit_sha":null,"homepage":"https://www.jsonx.org/java/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jsonx-org.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-09-15T16:15:04.000Z","updated_at":"2025-01-13T07:46:00.000Z","dependencies_parsed_at":"2023-09-29T11:18:07.751Z","dependency_job_id":"1586e7f3-7a03-4349-ad34-919a4366b23a","html_url":"https://github.com/jsonx-org/java","commit_stats":{"total_commits":618,"total_committers":2,"mean_commits":309.0,"dds":0.09385113268608414,"last_synced_commit":"cf672ba57a8f881c256e1f16b0a59c95ca3c0dd7"},"previous_names":["jsonxorg/jsonx"],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jsonx-org%2Fjava","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jsonx-org%2Fjava/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jsonx-org%2Fjava/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jsonx-org%2Fjava/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jsonx-org","download_url":"https://codeload.github.com/jsonx-org/java/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253549352,"owners_count":21925925,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["binding","binding-generator","consumer-driven-contracts","enterprise","generator","java","jsd","jsdx","json","json-schema","jsonx","jsonx-schema","schema","validator"],"created_at":"2024-09-24T19:43:41.405Z","updated_at":"2025-05-11T10:26:38.592Z","avatar_url":"https://github.com/jsonx-org.png","language":"Java","readme":"# JSONx Framework for Java\n\n\u003e **JSON Schema for the enterprise**\n\n[![Build Status](https://github.com/jsonx-org/java/actions/workflows/build.yml/badge.svg)](https://github.com/jsonx-org/java/actions/workflows/build.yml)\n[![Coverage Status](https://coveralls.io/repos/github/jsonx-org/java/badge.svg)](https://coveralls.io/github/jsonx-org/java)\n[![Javadocs](https://www.javadoc.io/badge/org.jsonx/jsonx.svg)](https://www.javadoc.io/doc/org.jsonx/jsonx)\n[![Released Version](https://img.shields.io/maven-central/v/org.jsonx/jsonx.svg)](https://mvnrepository.com/artifact/org.jsonx/jsonx)\n![Snapshot Version](https://img.shields.io/nexus/s/org.jsonx/jsonx?label=maven-snapshot\u0026server=https%3A%2F%2Foss.sonatype.org)\n\n| **Submodule** | **Summary** |\n|:-|:-|\n| [runtime][runtime] | API to bind Java classes to JSON objects whose structure is expressed in the\u003cbr\u003e[\u003cins\u003eJSON Schema Definition Language\u003c/ins\u003e][schema]. |\n| [generator][generator] | Utility to generate Java binding classes from a JSD(x) schema. |\n| [validator][validator] | Utility to validate JSON documents against a JSD(x) schema. |\n| [jsonx-maven-plugin][jsonx-maven-plugin] | Maven plugin to generate and convert JSONx and JSD(x) bindings. |\n| [jaxrs][jaxrs] | JAX-RS `@Provider` to read and write JSON documents with the [\u003cins\u003eJSONx Runtime API\u003c/ins\u003e][#runtime]. |\n| [jsonxml][jsonxml] | Utility to convert and validate JSON and JSONx documents. |\n| [sample][sample] | Sample applications. |\n\n## Abstract\n\nThe \u003cins\u003eJSONx Framework for Java\u003c/ins\u003e provides a reference implementation processor, validator, and runtime API for the [\u003cins\u003eJSON Schema Definition Language (JSD)\u003c/ins\u003e][schema], which is a \u003cins\u003eschema language\u003c/ins\u003e for JSON designed in close resemblance to the [XMLSchema\u003csup\u003e❐\u003c/sup\u003e][xmlschema] specification. The framework also provides a collection of \u003cins\u003estructural\u003c/ins\u003e and \u003cins\u003efunctional\u003c/ins\u003e patterns intended to help developers work with JSON documents.\n\nThis document introduces the \u003cins\u003eJSONx Framework for Java\u003c/ins\u003e, and presents a directory of links to its constituent parts and related resources.\n\n## Table of Contents\n\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u003c/samp\u003e1 [\u003cins\u003eIntroduction\u003c/ins\u003e](#1-introduction)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e1.1 [Conventions Used in This Document](#11-conventions-used-in-this-document)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u003c/samp\u003e2 [\u003cins\u003eUse-Cases\u003c/ins\u003e](#2-use-cases)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e2.1 [Consumer Driven Contracts](#21-consumer-driven-contracts)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u003c/samp\u003e3 [\u003cins\u003eJSON Schema Definition Language\u003c/ins\u003e][#jsd]\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e3.1 [Purpose](#31-purpose)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e3.2 [Requirements](#32-requirements)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e3.3 [Getting Started](#33-getting-started)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e3.4 [JSD vs JSDx](#34-jsd-vs-jsdx)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e3.5 [\u003cins\u003eSpecification\u003c/ins\u003e](#35-specification)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u003c/samp\u003e4 [\u003cins\u003eJSONx Runtime API\u003c/ins\u003e][#runtime]\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e4.1 [Purpose](#41-purpose)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e4.2 [Requirements](#42-requirements)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e4.3 [Getting Started][#invoice-example]\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e4.4 [Specification](#44-specification)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u003c/samp\u003e5 [\u003cins\u003eJSONx Binding Generator\u003c/ins\u003e](#5-jsonx-binding-generator)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e5.1 [Purpose](#51-purpose)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e5.2 [Requirements](#52-requirements)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e5.3 [Getting Started](#53-getting-started)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e5.3.1 [Generator](#531-generator)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e5.3.2 [Converter][#converter]\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e5.4 [Specification](#54-specification)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u003c/samp\u003e6 [\u003cins\u003eJSONx Validator\u003c/ins\u003e](#6-jsonx-validator)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e6.1 [Purpose](#61-purpose)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e6.2 [Requirements](#62-requirements)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e6.3 [Getting Started](#63-getting-started)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e6.3.1 [Valid Case](#631-valid-case)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e6.3.2 [Invalid Case](#632-invalid-case)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e6.4 [Specification](#64-specification)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u003c/samp\u003e7 [\u003cins\u003eJSONx Integration for JAX-RS\u003c/ins\u003e](#7-jsonx-integration-for-jax-rs)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e7.1 [Purpose](#71-purpose)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e7.2 [Requirements](#72-requirements)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e7.3 [Getting Started](#73-getting-started)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e7.4 [Specification](#74-specification)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u003c/samp\u003e8 [\u003cins\u003eJSONx Maven Plugin\u003c/ins\u003e](#8-jsonx-maven-plugin)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e8.1 [Purpose](#81-purpose)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e8.2 [Requirements](#82-requirements)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e8.3 [Getting Started](#83-getting-started)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e8.4 [Specification](#84-specification)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u003c/samp\u003e9 [\u003cins\u003eJsonXml\u003c/ins\u003e](#9-jsonxml)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e9.1 [Purpose](#91-purpose)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e9.2 [Requirements](#92-requirements)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e9.3 [Getting Started](#93-getting-started)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e9.3.1 [JSON-to-XML](#931-json-to-xml)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e9.3.2 [XML-to-JSON](#932-xml-to-json)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/samp\u003e9.4 [Specification](#94-specification)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u003c/samp\u003e10 [\u003cins\u003eContributing\u003c/ins\u003e](#10-contributing)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u003c/samp\u003e11 [\u003cins\u003eSpecial Thanks\u003c/ins\u003e](#11-special-thanks)\u003cbr\u003e\n\u003csamp\u003e\u0026nbsp;\u0026nbsp;\u003c/samp\u003e12 [\u003cins\u003eLicense\u003c/ins\u003e](#12-license)\n\n## \u003cb\u003e1\u003c/b\u003e \u003cins\u003eIntroduction\u003c/ins\u003e\n\nThe \u003cins\u003eJSONx Framework for Java\u003c/ins\u003e was created to help developers address common problems and use-cases when working with JSON documents. The \u003cins\u003eJSONx Framework for Java\u003c/ins\u003e offers \u003cins\u003estructural\u003c/ins\u003e and \u003cins\u003efunctional\u003c/ins\u003e patterns that systematically reduce errors and pain-points commonly encountered when developing software that interfaces with JSON. The \u003cins\u003estructural\u003c/ins\u003e patterns are defined in the [\u003cins\u003eJSON Schema Definition Language\u003c/ins\u003e][schema], which is a programming-language-agnostic \u003cins\u003eschema language\u003c/ins\u003e used to describe constraints and document the meaning, usage and relationships of the constituent parts of JSON documents. The \u003cins\u003efunctional\u003c/ins\u003e patterns are reference implementations of the specification of the \u003cins\u003eschema language\u003c/ins\u003e, providing utilities that address common use-cases for applications that use JSON in one way or another. Common use-cases include:\n\n1. Definition of a normative contract between a producer and consumer of JSON documents.\n1. Validation of JSON documents conforming to a respective \u003cins\u003eschema document\u003c/ins\u003e.\n1. Java class runtime API for JSON documents conforming to a respective \u003cins\u003eschema document\u003c/ins\u003e.\n\n### \u003cb\u003e1.1\u003c/b\u003e Conventions Used in This Document\n\nThe key words \"MUST\", \"MUST NOT\", \"REQUIRED\", \"SHALL\", \"SHALL NOT\", \"SHOULD\", \"SHOULD NOT\", \"RECOMMENDED\", \"MAY\", and \"OPTIONAL\" in this document are to be interpreted as described in [RFC2119](https://www.ietf.org/rfc/rfc2119.txt).\n\n## \u003cb\u003e2\u003c/b\u003e \u003cins\u003eUse-Cases\u003c/ins\u003e\n\nThe following sections lists common use-cases where \u003cins\u003eJSONx Framework for Java\u003c/ins\u003e can be used.\n\n### \u003cb\u003e2.1\u003c/b\u003e Consumer Driven Contracts\n\nThe \u003cins\u003eJSONx Framework for Java\u003c/ins\u003e was created specifically with [\u003cins\u003eConsumer Driven Contracts\u003c/ins\u003e\u003csup\u003e❐\u003c/sup\u003e][cdc] in mind. With the [\u003cins\u003eJSON Schema Definition Language (JSD)\u003c/ins\u003e][#jsd], one can create a \u003cins\u003eConsumer Driven Contract (CDC)\u003c/ins\u003e with a model that includes the capacity to evolve based on schema versioning. Additionally, the \u003cins\u003eJSD\u003c/ins\u003e can be used by producers and consumers to validate documents in a communication protocol.\n\nThe following example illustrates a simple protocol that uses the CDC approach, and consists of the actors:\n\n1. **Producer**: Representing the provider of the \u003cins\u003eProductSearch\u003c/ins\u003e service.\n1. **Consumer1**: The first consumer of the \u003cins\u003eProductSearch\u003c/ins\u003e service.\n1. **Consumer2**: The second consumer of the \u003cins\u003eProductSearch\u003c/ins\u003e service.\n\nConsider a simple \u003cins\u003eProductSearch\u003c/ins\u003e service, which allows consumer applications to search a product catalogue.\n\nVersion **v1** of the protocol defines the contract:\n\n* **Request**\n\n  ```\n  GET /ProductSearch?name=\u003cname\u003e\n  ```\n\n* **Response**\n\n  ```diff\n  {\n    \"Version\": \"v1\",\n    \"CatalogueID\": \u003cnumber\u003e,\n    \"Name\": \u003cstring\u003e,\n    \"Price\": \u003cstring\u003e,\n    \"Manufacturer\": \u003cstring\u003e,\n    \"InStock\": \u003cboolean\u003e\n  }\n  ```\n\nThe schema that describes the **Response** contract is:\n\n\u003c!-- tabs:start --\u003e\n\n###### **JSD**\n\n```json\n{\n  \"jx:ns\": \"http://www.jsonx.org/schema-0.4.jsd\",\n  \"jx:schemaLocation\": \"http://www.jsonx.org/schema-0.4.jsd http://www.jsonx.org/schema.jsd\",\n\n  \"product\": { \"jx:type\": \"object\", \"abstract\": true, \"properties\": {\n    \"CatalogueID\": { \"jx:type\": \"number\", \"range\": \"[1,]\", \"scale\": 0, \"nullable\": false},\n    \"Name\": { \"jx:type\": \"string\", \"pattern\": \"\\\\S|\\\\S.*\\\\S\", \"nullable\": false },\n    \"Price\": { \"jx:type\": \"string\", \"pattern\": \"\\\\$\\\\d+\\\\.\\\\d{2}\", \"nullable\": false },\n    \"Manufacturer\": { \"jx:type\": \"string\", \"pattern\": \"\\\\S|\\\\S.*\\\\S\", \"nullable\": false },\n    \"InStock\": { \"jx:type\": \"boolean\", \"nullable\": false} } },\n\n  \"product1\": { \"jx:type\": \"object\", \"extends\": \"product\", \"properties\": {\n    \"Version\": { \"jx:type\": \"string\", \"pattern\": \"v1\", \"nullable\": false } } }\n}\n```\n\n###### **JSDx**\n\n```xml\n\u003cschema\n  xmlns=\"http://www.jsonx.org/schema-0.4.xsd\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xsi:schemaLocation=\"http://www.jsonx.org/schema-0.4.xsd http://www.jsonx.org/schema.xsd\"\u003e\n\n  \u003cobject name=\"product\" abstract=\"true\"\u003e\n    \u003cproperty name=\"CatalogueID\" xsi:type=\"number\" range=\"[1,]\" scale=\"0\" nullable=\"false\"/\u003e\n    \u003cproperty name=\"Name\" xsi:type=\"string\" pattern=\"\\S|\\S.*\\S\" nullable=\"false\"/\u003e\n    \u003cproperty name=\"Price\" xsi:type=\"string\" pattern=\"\\$\\d+\\.\\d{2}\" nullable=\"false\"/\u003e\n    \u003cproperty name=\"Manufacturer\" xsi:type=\"string\" pattern=\"\\S|\\S.*\\S\" nullable=\"false\"/\u003e\n    \u003cproperty name=\"InStock\" xsi:type=\"boolean\" nullable=\"false\"/\u003e\n  \u003c/object\u003e\n\n  \u003cobject name=\"product1\" extends=\"product\"\u003e\n    \u003cproperty name=\"Version\" xsi:type=\"string\" pattern=\"v1\" nullable=\"false\"/\u003e\n  \u003c/object\u003e\n\n\u003c/schema\u003e\n```\n\n\u003c!-- tabs:end --\u003e\n\n\u003csub\u003e_**Note:** The [Converter][#converter] utility automatically converts between \u003cins\u003eJSD\u003c/ins\u003e and \u003cins\u003eJSDx\u003c/ins\u003e._\u003c/sub\u003e\n\nAll actors -- **Producer**, **Consumer1**, and **Consumer2** -- agree on the contract, and implement and integrate the protocol into their systems. To assert receipt of contract-compliant documents, all actors use the contract definition to automatically validate received and sent messages.\n\nAfter many months of running in production, **Consumer2** issues a request to the **Producer** to provide additional information in the response. Specifically, **Consumer2** requests for the addition of another field in the JSON response:\n\n```diff\n{\n- \"Version\": \"v1.0\",\n+ \"Version\": \"v2.0\",\n  \"CatalogueID\": \u003cnumber\u003e,\n  \"Name\": \u003cstring\u003e,\n  \"Price\": \u003cstring\u003e,\n  \"Manufacturer\": \u003cstring\u003e,\n  \"InStock\": \u003cboolean\u003e,\n+ \"Description\": \u003cstring\u003e\n}\n```\n\nTo satisfy **Consumer2**'s request, the contract is updated to support version **v2** of the **Response**:\n\n\u003c!-- tabs:start --\u003e\n\n###### **JSD**\n\n```diff\n{\n  \"jx:ns\": \"http://www.jsonx.org/schema-0.4.jsd\",\n  \"jx:schemaLocation\": \"http://www.jsonx.org/schema-0.4.jsd http://www.jsonx.org/schema.jsd\",\n\n  \"product\": { \"jx:type\": \"object\", \"abstract\": true, \"properties\": {\n    \"CatalogueID\": { \"jx:type\": \"number\", \"range\": \"[1,]\", \"scale\": 0, \"nullable\": false},\n    \"Name\": { \"jx:type\": \"string\", \"pattern\": \"\\\\S|\\\\S.*\\\\S\", \"nullable\": false },\n    \"Price\": { \"jx:type\": \"string\", \"pattern\": \"\\\\$\\\\d+\\\\.\\\\d{2}\", \"nullable\": false },\n    \"Manufacturer\": { \"jx:type\": \"string\", \"pattern\": \"\\\\S|\\\\S.*\\\\S\", \"nullable\": false },\n    \"InStock\": { \"jx:type\": \"boolean\", \"nullable\": false} } },\n\n  \"product1\": { \"jx:type\": \"object\", \"extends\": \"product\", \"properties\": {\n    \"Version\": { \"jx:type\": \"string\", \"pattern\": \"v1\", \"nullable\": false } } }\n\n+ \"product2\": { \"jx:type\": \"object\", \"extends\": \"product\", \"properties\": {\n+   \"Version\": { \"jx:type\": \"string\", \"pattern\": \"v2\", \"nullable\": false },\n+   \"Description\": { \"jx:type\": \"string\", \"pattern\": \"\\\\S|\\\\S.*\\\\S\", \"nullable\": false } } }\n}\n```\n\n###### **JSDx**\n\n```diff\n\u003cschema\n  xmlns=\"http://www.jsonx.org/schema-0.4.xsd\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xsi:schemaLocation=\"http://www.jsonx.org/schema-0.4.xsd http://www.jsonx.org/schema.xsd\"\u003e\n\n  \u003cobject name=\"product\" abstract=\"true\"\u003e\n    \u003cproperty name=\"CatalogueID\" xsi:type=\"number\" range=\"[1,]\" scale=\"0\" nullable=\"false\"/\u003e\n    \u003cproperty name=\"Name\" xsi:type=\"string\" pattern=\"\\S|\\S.*\\S\" nullable=\"false\"/\u003e\n    \u003cproperty name=\"Price\" xsi:type=\"string\" pattern=\"\\$\\d+\\.\\d{2}\" nullable=\"false\"/\u003e\n    \u003cproperty name=\"Manufacturer\" xsi:type=\"string\" pattern=\"\\S|\\S.*\\S\" nullable=\"false\"/\u003e\n    \u003cproperty name=\"InStock\" xsi:type=\"boolean\" nullable=\"false\"/\u003e\n  \u003c/object\u003e\n\n  \u003cobject name=\"product1\" extends=\"product\"\u003e\n    \u003cproperty name=\"Version\" xsi:type=\"string\" pattern=\"v1\" nullable=\"false\"/\u003e\n  \u003c/object\u003e\n\n+ \u003cobject name=\"product2\" extends=\"product\"\u003e\n+   \u003cproperty name=\"Version\" xsi:type=\"string\" pattern=\"v2\" nullable=\"false\"/\u003e\n+   \u003cproperty name=\"Description\" xsi:type=\"string\" pattern=\"\\S|\\S.*\\S\" nullable=\"false\"/\u003e\n+ \u003c/object\u003e\n\n\u003c/schema\u003e\n```\n\n\u003c!-- tabs:end --\u003e\n\n\u003csub\u003e_**Note:** The [Converter][#converter] utility automatically converts between \u003cins\u003eJSD\u003c/ins\u003e and \u003cins\u003eJSDx\u003c/ins\u003e._\u003c/sub\u003e\n\nWith this approach, the **v2** evolution of the contract satisfies **Customer2**. And, since the contract also retains support for **v1**, integration with **Customer1** is unaffected.\n\n_For the application code, see **[\u003cins\u003eSample: Consumer Driven Contracts\u003c/ins\u003e][sample-cdc]**._\n\n## \u003cb\u003e3\u003c/b\u003e \u003cins\u003eJSON Schema Definition Language\u003c/ins\u003e\n\nDescribes JSON documents using schema components to constrain and document the meaning, usage and relationships of their constituent parts: value types and their content.\n\n### \u003cb\u003e3.1\u003c/b\u003e Purpose\n\nProvide a \u003cins\u003eschema language\u003c/ins\u003e to describe normative contracts between producer and consumer ends of a protocol exchanging JSON documents.\n\n### \u003cb\u003e3.2\u003c/b\u003e Requirements\n\n1. The \u003cins\u003eschema language\u003c/ins\u003e MUST constrain and document the meaning, usage, constraints and relationships of the constituent parts of a JSON document.\n\n1. The \u003cins\u003eschema language\u003c/ins\u003e MUST provide meaningful and useful constraint rules for the 5 JSON value types:\n\n   `boolean`, `number`, `string`, `object`, `array`.\n\n1. The \u003cins\u003eschema language\u003c/ins\u003e MUST support schema descriptions for any and all legal JSON documents, as specified by [RFC2119](https://www.ietf.org/rfc/rfc2119.txt).\n\n1. The \u003cins\u003eschema language\u003c/ins\u003e MUST be free-of and agnostic-to patterns specific to any particular programming language.\n\n1. The \u003cins\u003eschema language\u003c/ins\u003e MUST be able to describe itself.\n\n### \u003cb\u003e3.3\u003c/b\u003e Getting Started\n\nThe \u003cins\u003eJSON Schema Definition Language\u003c/ins\u003e can be expressed in 2 forms: \u003cins\u003eJSD (Json Schema Document)\u003c/ins\u003e, and \u003cins\u003eJSDx (JSD in XML semantics)\u003c/ins\u003e.\n\nCreate `schema.jsd` or `schema.jsdx` with the following content:\n\n\u003c!-- tabs:start --\u003e\n\n###### **JSD**\n\n```json\n{\n  \"jx:ns\": \"http://www.jsonx.org/schema-0.4.jsd\",\n  \"jx:schemaLocation\": \"http://www.jsonx.org/schema-0.4.jsd http://www.jsonx.org/schema.jsd\",\n\n  \"myNumber\": { \"jx:type\": \"number\", \"range\": \"[-1,1)\" },\n  \"myString\": { \"jx:type\": \"string\", \"pattern\": \"[a-z]+\" },\n  \"myObject\": {\n    \"jx:type\": \"object\", \"properties\": {\n      \"myArray\": {\n        \"jx:type\": \"array\", \"elements\": [\n          { \"jx:type\": \"boolean\" },\n          { \"jx:type\": \"reference\", \"type\": \"myNumber\" },\n          { \"jx:type\": \"reference\", \"type\": \"myString\" },\n          { \"jx:type\": \"array\", \"elements\": [\n            { \"jx:type\": \"boolean\" },\n            { \"jx:type\": \"number\", \"range\": \"[0,100]\", \"scale\": 0 },\n            { \"jx:type\": \"string\", \"pattern\": \"[0-9]+\" },\n            { \"jx:type\": \"any\", \"types\": \"myNumber myString\" } ]},\n        { \"jx:type\": \"reference\", \"type\": \"myObject\" },\n        { \"jx:type\": \"any\", \"types\": \"myString myObject\" }]\n      }\n    }\n  }\n}\n```\n\n###### **JSDx**\n\n```xml\n\u003cschema\n  xmlns=\"http://www.jsonx.org/schema-0.4.xsd\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xsi:schemaLocation=\"http://www.jsonx.org/schema-0.4.xsd http://www.jsonx.org/schema.xsd\"\u003e\n\n  \u003cnumber name=\"myNumber\" range=\"[-1,1)\"/\u003e\n  \u003cstring name=\"myString\" pattern=\"[a-z]+\"/\u003e\n  \u003cobject name=\"myObject\"\u003e\n    \u003cproperty name=\"myArray\" xsi:type=\"array\"\u003e\n      \u003cboolean/\u003e\n      \u003creference type=\"myNumber\"/\u003e\n      \u003creference type=\"myString\"/\u003e\n      \u003carray\u003e\n        \u003cboolean/\u003e\n        \u003cnumber range=\"[0,100]\" scale=\"0\"/\u003e\n        \u003cstring pattern=\"[0-9]+\"/\u003e\n        \u003cany types=\"myNumber myString\"/\u003e\n      \u003c/array\u003e\n      \u003creference type=\"myObject\"/\u003e\n      \u003cany types=\"myString myObject\"/\u003e\n    \u003c/property\u003e\n  \u003c/object\u003e\n\n\u003c/schema\u003e\n```\n\n\u003c!-- tabs:end --\u003e\n\n\u003csub\u003e_**Note:** You can use the [Converter][#converter] utility to automatically convert between \u003cins\u003eJSD\u003c/ins\u003e and \u003cins\u003eJSDx\u003c/ins\u003e._\u003c/sub\u003e\n\nThis example defines a schema with 3 types that express the following structure:\n\n1. Type **`myNumber`**: A `number` between the range -1 (inclusive) and 1 (exclusive).\n1. Type **`myString`**: A `string` with the regex patter \"[a-z]+\".\n1. Type **`myObject`**: An `object` that has one property:\n   1. \"myArray\": An `array` that defines a sequence of elements:\n      1. `boolean`\n      1. **`myNumber`**\n      1. **`myString`**\n      1. An `array` with the following elements:\n         1. `boolean`\n         1. An integer `number` between 0 and 100.\n         1. A `string` of pattern \"[0-9]+\"\n         1. Either **`myNumber`** or **`myString`**.\n      1. `myObject`\n      1. Either **`myString`** or **`myObject`**.\n\n### \u003cb\u003e3.4\u003c/b\u003e JSD vs JSDx\n\nThe \u003cins\u003eJSDx\u003c/ins\u003e format offers XML validation, and using an XML IDE like [oXygen XML Editor\u003csup\u003e❐\u003c/sup\u003e][oxygenxml] offers edit-time XML validation, such as:\n\n\u003cimg src=\"https://user-images.githubusercontent.com/1258414/61751752-aae93800-ada9-11e9-88b1-65de08f125b5.png\" width=\"75%\"\u003e\n\nWhen using the \u003cins\u003eJSDx\u003c/ins\u003e format with the [oXygen XML Editor\u003csup\u003e❐\u003c/sup\u003e][oxygenxml], the auto-completion features of the editor will guide you in writing the schema. With the \u003cins\u003eJSDx\u003c/ins\u003e format, the XML editor will also validate keys and keyrefs to ensure that declared types are referenced correctly.\n\n### \u003cb\u003e3.5\u003c/b\u003e Specification\n\n_For a detailed specification of the \u003cins\u003eschema language\u003c/ins\u003e, see **[\u003cins\u003eJSON Schema Definition Language\u003c/ins\u003e][schema]**._\n\n## \u003cb\u003e4\u003c/b\u003e \u003cins\u003eJSONx Runtime API\u003c/ins\u003e\n\nProvides a way for JSON objects whose structure is expressed in the [\u003cins\u003eJSON Schema Definition Language\u003c/ins\u003e][schema] to be \u003cins\u003evalidated\u003c/ins\u003e, \u003cins\u003eparsed\u003c/ins\u003e and \u003cins\u003emarshaled\u003c/ins\u003e, to and from Java objects of strongly-typed classes.\n\n### \u003cb\u003e4.1\u003c/b\u003e Purpose\n\nProvide a \u003cins\u003eruntime API\u003c/ins\u003e for parsing and marshaling JSON documents to and from strongly-typed Java classes.\n\n### \u003cb\u003e4.2\u003c/b\u003e Requirements\n\n1. The \u003cins\u003eruntime API\u003c/ins\u003e MUST be able to model the full scope of normative meaning, usage, constraints and relationships of the constituent parts of a JSON document as specifiable with the \u003cins\u003eschema language\u003c/ins\u003e.\n\n1. The \u003cins\u003eruntime API\u003c/ins\u003e MUST enforce (via validation) the full scope of normative meaning, usage, constraints and relationships of the constituent parts of a JSON document as specifiable in the \u003cins\u003eschema language\u003c/ins\u003e.\n\n1. The \u003cins\u003eruntime API\u003c/ins\u003e MUST produce clear and useful error messages when exception of \u003cins\u003eschema document\u003c/ins\u003e constraints are encountered during validation of JSON documents.\n\n1. The \u003cins\u003eruntime API\u003c/ins\u003e MUST constrain the constituent parts of a \u003cins\u003eschema document\u003c/ins\u003e to Java type bindings that are as lightweight as necessary to retain the full normative scope of specification of the \u003cins\u003eschema language\u003c/ins\u003e.\n\n1. The \u003cins\u003eruntime API\u003c/ins\u003e MUST use light coupling, not imposing requirements for exclusionary patterns onto a class model of binding classes.\n\n1. The \u003cins\u003eruntime API\u003c/ins\u003e MUST offer easy patterns for manual description of bindings.\n\n1. The \u003cins\u003eruntime API\u003c/ins\u003e MUST be straightforward, intuitive, and resilient to human error.\n\n### \u003cb\u003e4.3\u003c/b\u003e Getting Started\n\nThe \u003cins\u003eJSONx Runtime API\u003c/ins\u003e uses annotations to bind class definitions to usage, constraints and relationships specifiable in the \u003cins\u003eschema language\u003c/ins\u003e.\n\nThe following illustrates usage of the \u003cins\u003eruntime API\u003c/ins\u003e with an example of an **invoice**.\n\n\u0026nbsp;\u0026nbsp;1.\u0026nbsp;Create `invoice.jsd` or `invoice.jsdx` in `src/main/resources/`:\n\n\u003c!-- tabs:start --\u003e\n\n###### **JSD**\n\n```json\n{\n  \"jx:ns\": \"http://www.jsonx.org/schema-0.4.jsd\",\n  \"jx:schemaLocation\": \"http://www.jsonx.org/schema-0.4.jsd http://www.jsonx.org/schema.jsd\",\n\n  \"money\": { \"jx:type\": \"number\", \"range\": \"[0,]\", \"scale\": 2},\n  \"positiveInteger\": { \"jx:type\": \"number\", \"range\": \"[1,]\", \"scale\": 0},\n  \"date\": { \"jx:type\": \"string\", \"pattern\": \"-?\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(02-(0[1-9]|1\\\\d|2\\\\d))|((0[469]|11)-(0[1-9]|[12]\\\\d|30)))\" },\n  \"nonEmptyString\": { \"jx:type\": \"string\", \"pattern\": \"\\\\S|\\\\S.*\\\\S\" },\n  \"address\": { \"jx:type\": \"object\", \"properties\": {\n    \"name\": { \"jx:type\": \"reference\", \"nullable\": false, \"type\": \"nonEmptyString\" },\n    \"address\": { \"jx:type\": \"reference\", \"nullable\": false, \"type\": \"nonEmptyString\" },\n    \"city\": { \"jx:type\": \"reference\", \"nullable\": false, \"type\": \"nonEmptyString\" },\n    \"postalCode\": { \"jx:type\": \"reference\", \"nullable\": false, \"type\": \"nonEmptyString\", \"use\": \"optional\" },\n    \"country\": { \"jx:type\": \"reference\", \"type\": \"nonEmptyString\" } }\n  },\n  \"invoice\": { \"jx:type\": \"object\", \"properties\": {\n    \"number\": { \"jx:type\": \"reference\", \"type\": \"positiveInteger\" },\n    \"date\": { \"jx:type\": \"reference\", \"type\": \"date\" },\n    \"billingAddress\": { \"jx:type\": \"reference\", \"type\": \"address\" },\n    \"shippingAddress\": { \"jx:type\": \"reference\", \"type\": \"address\" },\n    \"billedItems\": { \"jx:type\": \"array\", \"nullable\": false, \"elements\": [\n      { \"jx:type\": \"reference\", \"type\": \"item\" } ] } }\n  },\n  \"item\": { \"jx:type\": \"object\", \"properties\": {\n    \"description\": { \"jx:type\": \"reference\", \"nullable\": false, \"type\": \"nonEmptyString\" },\n    \"code\": { \"jx:type\": \"reference\", \"nullable\": false, \"type\": \"positiveInteger\" },\n    \"quantity\": { \"jx:type\": \"reference\", \"nullable\": false, \"type\": \"positiveInteger\" },\n    \"price\": { \"jx:type\": \"reference\", \"nullable\": false, \"type\": \"money\" } }\n  }\n}\n```\n\n###### **JSDx**\n\n```xml\n\u003cschema\n  xmlns=\"http://www.jsonx.org/schema-0.4.xsd\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xsi:schemaLocation=\"http://www.jsonx.org/schema-0.4.xsd http://www.jsonx.org/schema.xsd\"\u003e\n\n  \u003cnumber name=\"money\" range=\"[0,]\" scale=\"2\"/\u003e\n  \u003cnumber name=\"positiveInteger\" range=\"[1,]\" scale=\"0\"/\u003e\n  \u003cstring name=\"date\" pattern=\"-?\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(02-(0[1-9]|1\\d|2\\d))|((0[469]|11)-(0[1-9]|[12]\\d|30)))\"/\u003e\n  \u003cstring name=\"nonEmptyString\" pattern=\"\\S|\\S.*\\S\"/\u003e\n  \u003cobject name=\"address\"\u003e\n    \u003cproperty name=\"name\" xsi:type=\"reference\" type=\"nonEmptyString\" nullable=\"false\"/\u003e\n    \u003cproperty name=\"address\" xsi:type=\"reference\" type=\"nonEmptyString\" nullable=\"false\"/\u003e\n    \u003cproperty name=\"city\" xsi:type=\"reference\" type=\"nonEmptyString\" nullable=\"false\"/\u003e\n    \u003cproperty name=\"postalCode\" xsi:type=\"reference\" type=\"nonEmptyString\" nullable=\"false\" use=\"optional\"/\u003e\n    \u003cproperty name=\"country\" xsi:type=\"reference\" type=\"nonEmptyString\"/\u003e\n  \u003c/object\u003e\n  \u003cobject name=\"invoice\"\u003e\n    \u003cproperty name=\"number\" xsi:type=\"reference\" type=\"positiveInteger\"/\u003e\n    \u003cproperty name=\"date\" xsi:type=\"reference\" type=\"date\"/\u003e\n    \u003cproperty name=\"billingAddress\" xsi:type=\"reference\" type=\"address\"/\u003e\n    \u003cproperty name=\"shippingAddress\" xsi:type=\"reference\" type=\"address\"/\u003e\n    \u003cproperty name=\"billedItems\" xsi:type=\"array\" nullable=\"false\"\u003e\n      \u003creference type=\"item\"/\u003e\n    \u003c/property\u003e\n  \u003c/object\u003e\n  \u003cobject name=\"item\"\u003e\n    \u003cproperty name=\"description\" xsi:type=\"reference\" type=\"nonEmptyString\" nullable=\"false\"/\u003e\n    \u003cproperty name=\"code\" xsi:type=\"reference\" type=\"positiveInteger\" nullable=\"false\"/\u003e\n    \u003cproperty name=\"quantity\" xsi:type=\"reference\" type=\"positiveInteger\" nullable=\"false\"/\u003e\n    \u003cproperty name=\"price\" xsi:type=\"reference\" type=\"money\" nullable=\"false\"/\u003e\n  \u003c/object\u003e\n\n\u003c/schema\u003e\n```\n\n\u003c!-- tabs:end --\u003e\n\n\u003csub\u003e_**Note:** You can use the [Converter][#converter] utility to automatically convert between \u003cins\u003eJSD\u003c/ins\u003e and \u003cins\u003eJSDx\u003c/ins\u003e._\u003c/sub\u003e\n\n\u0026nbsp;\u0026nbsp;2.\u0026nbsp;With the `invoice.jsd` or `invoice.jsdx`, you can use the [`jsonx-maven-plugin`][jsonx-maven-plugin] to automatically generate the Java class files. In your POM, add:\n\n```xml\n\u003cplugin\u003e\n  \u003cgroupId\u003eorg.jsonx\u003c/groupId\u003e\n  \u003cartifactId\u003ejsonx-maven-plugin\u003c/artifactId\u003e\n  \u003cversion\u003e0.4.0\u003c/version\u003e\n  \u003cexecutions\u003e\n    \u003cexecution\u003e\n      \u003cgoals\u003e\n        \u003cgoal\u003egenerate\u003c/goal\u003e\n      \u003c/goals\u003e\n      \u003cphase\u003egenerate-sources\u003c/phase\u003e\n      \u003cconfiguration\u003e\n        \u003cdestDir\u003e${project.build.directory}/generated-sources/jsonx\u003c/destDir\u003e\n        \u003cprefix\u003ecom.example.invoice.\u003c/prefix\u003e\n        \u003cschemas\u003e\n          \u003cschema\u003esrc/main/resources/invoice.jsd\u003c/schema\u003e \u003c!-- or invoice.jsdx --\u003e\n        \u003c/schemas\u003e\n      \u003c/configuration\u003e\n    \u003c/execution\u003e\n  \u003c/executions\u003e\n\u003c/plugin\u003e\n```\n\n\u0026nbsp;\u0026nbsp;3.\u0026nbsp;**(Alternatively)** Create the Java class files by hand:\n\n\u003csup\u003e_**Note:** Set-ters and get-ters have been replaced with public fields for conciseness._\u003c/sup\u003e\n\n```java\nimport org.jsonx.*;\n\npublic class Address implements JxObject {\n  @StringProperty(pattern=\"\\\\S|\\\\S.*\\\\S\", nullable=false)\n  public String name;\n\n  @StringProperty(pattern=\"\\\\S|\\\\S.*\\\\S\", nullable=false)\n  public String address;\n\n  @StringProperty(pattern=\"\\\\S|\\\\S.*\\\\S\", nullable=false)\n  public String city;\n\n  @StringProperty(pattern=\"\\\\S|\\\\S.*\\\\S\", use=Use.OPTIONAL, nullable=false)\n  public String postalCode;\n\n  @StringProperty(pattern=\"\\\\S|\\\\S.*\\\\S\")\n  public String country;\n}\n```\n\n```java\nimport org.jsonx.*;\n\npublic class Item implements JxObject {\n  @StringProperty(pattern=\"\\\\S|\\\\S.*\\\\S\", nullable=false)\n  public String description;\n\n  @NumberProperty(range=\"[1,]\", scale=0, nullable=false)\n  public long code;\n\n  @NumberProperty(range=\"[1,]\", scale=0, nullable=false)\n  public long quantity;\n\n  @NumberProperty(range=\"[1,]\", scale=2, nullable=false)\n  public java.math.BigDecimal price;\n }\n```\n\n```java\nimport org.jsonx.*;\n\npublic class Invoice implements JxObject {\n  @NumberProperty(range=\"[1,]\", scale=0)\n  public Long number;\n\n  @StringProperty(pattern=\"-?\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(02-(0[1-9]|1\\\\d|2\\\\d))|((0[469]|11)-(0[1-9]|[12]\\\\d|30)))\")\n  public String date;\n\n  @ObjectProperty\n  public Address billingAddress;\n\n  @ObjectProperty\n  public Address shippingAddress;\n\n  @ObjectElement(id=0, type=Item.class)\n  @ArrayProperty(elementIds={0}, nullable=false)\n  public java.util.List\u003cItem\u003e billedItems;\n}\n```\n\n\u0026nbsp;\u0026nbsp;4.\u0026nbsp;You can use these classes to represent `Address`es, `Item`s, and `Invoice`s.\n\n```java\nAddress address = new Address();\naddress.name = \"John Doe\";\naddress.address = \"111 Wall St.\";\naddress.city = \"New York\";\naddress.postalCode = \"10043\";\naddress.country = \"USA\";\n\nItem item = new Item();\nitem.code = 123;\nitem.description = \"Pocket Protector\";\nitem.price = new BigDecimal(\"14.99\");\nitem.quantity = 5;\n\nInvoice invoice = new Invoice();\ninvoice.number = 14738L;\ninvoice.date = \"2019-05-13\";\ninvoice.billingAddress = address;\ninvoice.shippingAddress = address;\ninvoice.billedItems = Collections.singletonList(item);\n```\n\n\u0026nbsp;\u0026nbsp;5.\u0026nbsp;You can now \u003cins\u003emarshal\u003c/ins\u003e the Java objects to JSON:\n\n```java\n\nString json = JxEncoder._2.marshal(invoice);\nSystem.out.println(json);\n```\n\n... will produce:\n\n```json\n{\n  \"number\": 14738,\n  \"date\": \"2019-05-13\",\n  \"billingAddress\": {\n    \"name\": \"John Doe\",\n    \"address\": \"111 Wall St.\",\n    \"city\": \"New York\",\n    \"postalCode\": \"10043\",\n    \"country\": \"USA\"\n  },\n  \"shippingAddress\": {\n    \"name\": \"John Doe\",\n    \"address\": \"111 Wall St.\",\n    \"city\": \"New York\",\n    \"postalCode\": \"10043\",\n    \"country\": \"USA\"\n  },\n  \"billedItems\": [{\n    \"description\": \"Pocket Protector\",\n    \"code\": 123,\n    \"quantity\": 5,\n    \"price\": 14.99\n  }]\n}\n```\n\n\u0026nbsp;\u0026nbsp;6.\u0026nbsp;You can also \u003cins\u003eparse\u003c/ins\u003e the JSON into Java objects:\n\n```java\nInvoice invoice2 = JxDecoder.parseObject(Invoice.class, new JsonReader(new StringReader(json)));\nassertEquals(invoice, invoice2);\n```\n\n_For the application code, see **[\u003cins\u003eSample: Invoice\u003c/ins\u003e][sample-invoice]**._\n\n### \u003cb\u003e4.4\u003c/b\u003e Specification\n\n_For a detailed specification of the \u003cins\u003eruntime API\u003c/ins\u003e, see **[\u003cins\u003eJSONx Runtime API\u003c/ins\u003e][runtime]**._\n\n## \u003cb\u003e5\u003c/b\u003e \u003cins\u003eJSONx Binding Generator\u003c/ins\u003e\n\nConsumes a JSD schema, and generates classes that use the [\u003cins\u003eJSONx Runtime API\u003c/ins\u003e][#runtime] to achieve binding between JSON documents conforming to a JSD schema, and Java object represetations of these documents.\n\n### \u003cb\u003e5.1\u003c/b\u003e Purpose\n\nProvide a \u003cins\u003ebinding generator\u003c/ins\u003e utility for automatic generation of binding classes from a \u003cins\u003eschema document\u003c/ins\u003e.\n\n### \u003cb\u003e5.2\u003c/b\u003e Requirements\n\n1. The \u003cins\u003ebinding generator\u003c/ins\u003e MUST be able to consume a \u003cins\u003eschema document\u003c/ins\u003e, and produce Java class definitions (`.java` files) that use the \u003cins\u003eruntime API\u003c/ins\u003e.\n\n1. The \u003cins\u003ebinding generator\u003c/ins\u003e MUST be able to consume Java class definitions (`.class` files) utilizing the \u003cins\u003eruntime API\u003c/ins\u003e, and produce a \u003cins\u003eschema document\u003c/ins\u003e.\n\n1. The \u003cins\u003ebinding generator\u003c/ins\u003e MUST create Java classes (`.java` files) that encode the full normative scope of the \u003cins\u003eschema document\u003c/ins\u003e.\n\n1. The \u003cins\u003ebinding generator\u003c/ins\u003e MUST represent the constituent parts of a \u003cins\u003eschema document\u003c/ins\u003e with Java type bindings that are as strongly-typed as possible, but not limiting in any way with regard to the definition of the respective constituent part.\n\n1. The \u003cins\u003ebinding generator\u003c/ins\u003e MUST be able to validate a \u003cins\u003eschema document\u003c/ins\u003e.\n\n### \u003cb\u003e5.3\u003c/b\u003e Getting Started\n\nThe \u003cins\u003eJSONx Binding Generator\u003c/ins\u003e provides convenience utilities for generating bindings and converting \u003cins\u003eschema document\u003c/ins\u003es. The following illustrates example usage of the `Generator` and `Converter` executable classes.\n\n#### \u003cb\u003e5.3.1\u003c/b\u003e `Generator`\n\nThe following example generates binding classes (`.java` files) in `target/generated-sources/jsonx` for the \u003cins\u003eschema document\u003c/ins\u003e at `src/main/resources/example.jsd`, with prefix `org.example$`.\n\n```bash\njava -cp ... org.jsonx.Generator --prefix org.example$ -d target/generated-sources/jsonx src/main/resources/example.jsd\n```\n\n#### \u003cb\u003e5.3.2\u003c/b\u003e `Converter`\n\nThe following example converts the JSD file at `src/main/resources/example.jsd` to a \u003cins\u003eJSDx\u003c/ins\u003e file in `target/generated-resources`.\n\n```bash\njava -cp ... org.jsonx.Converter src/main/resources/example.jsd target/generated-resources/example.jsdx\n```\n\n### \u003cb\u003e5.4\u003c/b\u003e Specification\n\n_For a detailed specification of the \u003cins\u003ebinding generator\u003c/ins\u003e, see **[\u003cins\u003eJSONx Binding Generator\u003c/ins\u003e][generator]**._\n\n## \u003cb\u003e6\u003c/b\u003e \u003cins\u003eJSONx Validator\u003c/ins\u003e\n\nThe \u003cins\u003eJSONx Validator\u003c/ins\u003e consumes a JSD schema and a JSON document, and returns successfully if the specified documents are valid against the provided schema, or fails with an exception specifying the validation error if the specified document is invalid against the provided schema. The \u003cins\u003eJSONx Validator\u003c/ins\u003e utilizes the \u003cins\u003eJSONx Binding Generator\u003c/ins\u003e to perform its validation.\n\n## \u003cb\u003e6.1\u003c/b\u003e \u003cins\u003ePurpose\u003c/ins\u003e\n\nProvide a \u003cins\u003evalidator\u003c/ins\u003e utility for automatic validation of JSON documents against a \u003cins\u003eschema document\u003c/ins\u003e.\n\n## \u003cb\u003e6.2\u003c/b\u003e \u003cins\u003eRequirements\u003c/ins\u003e\n\n1. The \u003cins\u003evalidator\u003c/ins\u003e MUST be able to consume a \u003cins\u003eJSON document\u003c/ins\u003e, and validate its contents agains a provided \u003cins\u003eschema document\u003c/ins\u003e.\n\n1. The \u003cins\u003evalidator\u003c/ins\u003e MUST return successfully if a \u003cins\u003eJSON document\u003c/ins\u003e conforms to the provided \u003cins\u003eschema document\u003c/ins\u003e.\n\n1. The \u003cins\u003evalidator\u003c/ins\u003e MUST throw an exception specifying the validation error if a \u003cins\u003eJSON document\u003c/ins\u003e does not conform to the provided \u003cins\u003eschema document\u003c/ins\u003e.\n\n## \u003cb\u003e6.3\u003c/b\u003e \u003cins\u003eGetting Started\u003c/ins\u003e\n\nThe \u003cins\u003eJSONx Validator\u003c/ins\u003e provides convenience utilities for validating a \u003cins\u003eJSON document\u003c/ins\u003e agains a \u003cins\u003eschema document\u003c/ins\u003e. The following illustrates example usage of the `Validator`.\n\n### \u003cb\u003e6.3.1\u003c/b\u003e Valid Case\n\nThe following example uses the `Validator` to validate a \u003ci\u003evalid\u003c/i\u003e \u003cins\u003eJSON document\u003c/ins\u003e against a \u003cins\u003eschema document\u003c/ins\u003e.\n\n```bash\n$ java -cp ... org.jsonx.Validator src/main/resources/example.jsd src/main/resources/valid.json\n$ echo $?\n0\n```\n\n### \u003cb\u003e6.3.2\u003c/b\u003e Invalid Case\n\nThe following example uses the `Validator` to validate an \u003ci\u003einvalid\u003c/i\u003e \u003cins\u003eJSON document\u003c/ins\u003e against a \u003cins\u003eschema document\u003c/ins\u003e.\n\n```bash\n$ java -cp ... org.jsonx.Validator src/main/resources/example.jsd src/main/resources/invalid.json\nInvalid content was found in empty array: @org.jsonx.StringElement(id=0, pattern=\"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\"): Content is not complete\n$ echo $?\n1\n```\n\n## \u003cb\u003e6.4\u003c/b\u003e \u003cins\u003eSpecification\u003c/ins\u003e\n\nThe `Validator` is a utility class that can be used on the CLI to validate a \u003cins\u003eJSON document\u003c/ins\u003e against a \u003cins\u003eschema document\u003c/ins\u003e. The `Validator` class has the following usage specification:\n\n```\nUsage: Usage: Validator \u003cSCHEMA\u003e \u003cJSON...\u003e\nSupported SCHEMA formats:\n                 \u003cJSD|JSDx\u003e\n```\n\n## \u003cb\u003e7\u003c/b\u003e \u003cins\u003eJSONx Integration for JAX-RS\u003c/ins\u003e\n\nImplements the `MessageBodyReader` and `MessageBodyWriter` interfaces in the JAX-RS API to integrate with JAX-RS server runtimes.\n\n### \u003cb\u003e7.1\u003c/b\u003e Purpose\n\nProvide \u003cins\u003eJSONx Integration for JAX-RS\u003c/ins\u003e for parsing and marshaling Java object instances of binding classes in a JAX-RS runtime.\n\n### \u003cb\u003e7.2\u003c/b\u003e Requirements\n\n1. The \u003cins\u003eJSONx Integration for JAX-RS\u003c/ins\u003e MUST support validation of JSON upon the consumption and production of documents in a JAX-RS runtime.\n\n1. The \u003cins\u003eJSONx Integration for JAX-RS\u003c/ins\u003e MUST support any JAX-RS application that implements the facets relevant to parsing and marshaling of entity object, as defined in the [JAX-RS 2.0 Specification](https://download.oracle.com/otn-pub/jcp/jaxrs-2_0-fr-eval-spec/jsr339-jaxrs-2.0-final-spec.pdf).\n\n1. The \u003cins\u003eJSONx Integration for JAX-RS\u003c/ins\u003e MUST be automatic and free of any configuration that would couple an application to the \u003cins\u003eJSONx Framework for Java\u003c/ins\u003e.\n\n### \u003cb\u003e7.3\u003c/b\u003e Getting Started\n\nThe \u003cins\u003eJSONx Integration for JAX-RS\u003c/ins\u003e sub-project provides a `Provider` implementing the `MessageBodyReader` and `MessageBodyWriter` interfaces that can be registered with a JAX-RS runtime.\n\nThe following illustrates example usage.\n\n\u0026nbsp;\u0026nbsp;1.\u0026nbsp;Create `account.jsd` or `account.jsdx` in `src/main/resources/`.\n\n\u003c!-- tabs:start --\u003e\n\n###### **JSD**\n\n```json\n{\n  \"jx:ns\": \"http://www.jsonx.org/schema-0.4.jsd\",\n  \"jx:schemaLocation\": \"http://www.jsonx.org/schema-0.4.jsd http://www.jsonx.org/schema.jsd\",\n\n  \"uuid\": { \"jx:type\": \"string\", \"pattern\": \"[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\" },\n  \"id\": { \"jx:type\": \"object\", \"abstract\": true, \"properties\": {\n    \"id\": { \"jx:type\": \"reference\", \"nullable\": false, \"type\": \"uuid\" } } },\n  \"credentials\": { \"jx:type\": \"object\", \"properties\": {\n    \"email\": { \"jx:type\": \"string\", \"nullable\": false, \"pattern\": \"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,6}\" },\n    \"password\": { \"jx:type\": \"string\", \"nullable\": false, \"pattern\": \"[0-9a-f]{64}\", \"use\": \"optional\" } } },\n  \"account\": { \"jx:type\": \"object\", \"extends\": \"credentials\", \"properties\": {\n    \"id\": { \"jx:type\": \"reference\", \"nullable\": false, \"type\": \"uuid\", \"use\": \"optional\" },\n    \"firstName\": { \"jx:type\": \"string\", \"nullable\": false },\n    \"lastName\": { \"jx:type\": \"string\", \"nullable\": false } } }\n}\n```\n\n###### **JSDx**\n\n```xml\n\u003cschema\n  xmlns=\"http://www.jsonx.org/schema-0.4.xsd\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xsi:schemaLocation=\"http://www.jsonx.org/schema-0.4.xsd http://www.jsonx.org/schema.xsd\"\u003e\n\n  \u003cstring name=\"uuid\" pattern=\"[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\"/\u003e\n  \u003cobject name=\"id\" abstract=\"true\"\u003e\n    \u003cproperty name=\"id\" xsi:type=\"reference\" type=\"uuid\" nullable=\"false\"/\u003e\n  \u003c/object\u003e\n  \u003cobject name=\"credentials\"\u003e\n    \u003cproperty xsi:type=\"string\" name=\"email\" pattern=\"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}\" nullable=\"false\"/\u003e\n    \u003cproperty xsi:type=\"string\" name=\"password\" pattern=\"[0-9a-f]{64}\" use=\"optional\" nullable=\"false\"/\u003e\n  \u003c/object\u003e\n  \u003cobject name=\"account\" extends=\"credentials\"\u003e\n    \u003cproperty name=\"id\" xsi:type=\"reference\" type=\"uuid\" nullable=\"false\" use=\"optional\"/\u003e\n    \u003cproperty name=\"firstName\" xsi:type=\"string\" nullable=\"false\"/\u003e\n    \u003cproperty name=\"lastName\" xsi:type=\"string\" nullable=\"false\"/\u003e\n  \u003c/object\u003e\n\n\u003c/schema\u003e\n```\n\n\u003c!-- tabs:end --\u003e\n\n\u003csub\u003e_**Note:** You can use the [Converter][#converter] utility to automatically convert between \u003cins\u003eJSD\u003c/ins\u003e and \u003cins\u003eJSDx\u003c/ins\u003e._\u003c/sub\u003e\n\n\u0026nbsp;\u0026nbsp;2.\u0026nbsp;Add the [`org.jsonx:jsonx-maven-plugin`][jsonx-maven-plugin] to the POM.\n\n```xml\n\u003cplugin\u003e\n  \u003cgroupId\u003eorg.jsonx\u003c/groupId\u003e\n  \u003cartifactId\u003ejsonx-maven-plugin\u003c/artifactId\u003e\n  \u003cversion\u003e0.4.0\u003c/version\u003e\n  \u003cexecutions\u003e\n    \u003cexecution\u003e\n      \u003cgoals\u003e\n        \u003cgoal\u003egenerate\u003c/goal\u003e\n      \u003c/goals\u003e\n      \u003cconfiguration\u003e\n        \u003cdestDir\u003e${project.build.directory}/generated-sources/jsonx\u003c/destDir\u003e\n        \u003cprefix\u003ecom.example.jsonx.\u003c/prefix\u003e\n        \u003cschemas\u003e\n          \u003cschema\u003esrc/main/resources/account.jsonx\u003c/schema\u003e\n        \u003c/schemas\u003e\n      \u003c/configuration\u003e\n    \u003c/execution\u003e\n  \u003c/executions\u003e\n\u003c/plugin\u003e\n```\n\n\u0026nbsp;\u0026nbsp;3.\u0026nbsp;Upon successful execution of the [`jsonx-maven-plugin`][jsonx-maven-plugin] plugin, Java class files will be generated in `generated-sources/jsonx`. Add this path to your Build Paths in your IDE to integrate into your project.\n\nThe generated classes can be instantiated as any other Java objects. They are strongly typed, and will guide you in proper construction of a JSON message. The following APIs can be used for parsing and marshalling \u003cins\u003eJSONx\u003c/ins\u003e to and from JSON:\n\nTo \u003cins\u003eparse\u003c/ins\u003e JSON to \u003cins\u003eJSONx\u003c/ins\u003e Bindings:\n\n```java\nString json = \"{\\\"email\\\":\\\"john@doe\\\",\\\"password\\\":\\\"066b91577bc547e21aa329c74d74b0e53e29534d4cc0ad455abba050121a9557\\\"}\";\nCredentials credentials = JxDecoder.parseObject(Credentials.class, new JsonReader(new StringReader(json)));\n```\n\nTo \u003cins\u003emarshal\u003c/ins\u003e \u003cins\u003eJSONx\u003c/ins\u003e Bindings to JSON:\n\n```java\nString json2 = JxEncoder.get().marshal(credentials);\nassertEquals(json, json2);\n```\n\n\u0026nbsp;\u0026nbsp;4.\u0026nbsp;Next, register the `JxObjectProvider` provider in the JAX-RS appilcation singletons, and implement the `AccountService`:\n\n```java\npublic class MyApplication extends javax.ws.rs.core.Application {\n  @Override\n  public Set\u003cObject\u003e getSingletons() {\n    return Collections.singleton(new JxObjectProvider(JxEncoder._2));\n  }\n}\n\n@Path(\"/account\")\n@RolesAllowed(\"registered\")\npublic class AccountService {\n  @GET\n  @Produces(\"application/vnd.example.v1+json\")\n  public Account get(@Context SecurityContext securityContext) {\n    Account account = new Account();\n    ...\n    return account;\n  }\n\n  @POST\n  @Consumes(\"application/vnd.example.v1+json\")\n  public void post(@Context SecurityContext securityContext, Account account) {\n    ...\n  }\n}\n```\n\n### \u003cb\u003e7.4\u003c/b\u003e Specification\n\n_For a detailed specification of \u003cins\u003eJSONx Integration for JAX-RS\u003c/ins\u003e, see **[\u003cins\u003eJSONx Integration for JAX-RS\u003c/ins\u003e][jaxrs]**._\n\n## \u003cb\u003e8\u003c/b\u003e \u003cins\u003eJSONx Maven Plugin\u003c/ins\u003e\n\nA Maven plugin for generating JSONx and JSD bindings.\n\n### \u003cb\u003e8.1\u003c/b\u003e Purpose\n\nProvide schema \u003cins\u003evalidation\u003c/ins\u003e, schema \u003cins\u003econversion\u003c/ins\u003e, and Java binding source \u003cins\u003egeneration\u003c/ins\u003e in a \u003cins\u003eMaven plugin\u003c/ins\u003e.\n\n### \u003cb\u003e8.2\u003c/b\u003e Requirements\n\n1. The \u003cins\u003eJSONx Maven plugin\u003c/ins\u003e MUST offer utilities for the generation of Java binding sources from a specified \u003cins\u003eschema document\u003c/ins\u003e.\n\n1. The \u003cins\u003eJSONx Maven plugin\u003c/ins\u003e MUST offer utilities for validation of \u003cins\u003eschema document\u003c/ins\u003es.\n\n1. The \u003cins\u003eJSONx Maven plugin\u003c/ins\u003e MUST offer utilities for conversion of \u003cins\u003eschema document\u003c/ins\u003es from \u003cins\u003eJSD\u003c/ins\u003e to \u003cins\u003eJSDx\u003c/ins\u003e, and vice versa.\n\n1. The \u003cins\u003eJSONx Maven plugin\u003c/ins\u003e MUST present clear and informative errors and warnings that arise during parsing and validation of \u003cins\u003eschema document\u003c/ins\u003es and JSON documents with an associated schema.\n\n### \u003cb\u003e8.3\u003c/b\u003e Getting Started\n\nThe \u003cins\u003eJSONx Maven Plugin\u003c/ins\u003e implements a Maven MOJO that can be used in a `pom.xml`. The following illustrates an example usage.\n\n```xml\n\u003cplugin\u003e\n  \u003cgroupId\u003eorg.jsonx\u003c/groupId\u003e\n  \u003cartifactId\u003ejsonx-maven-plugin\u003c/artifactId\u003e\n  \u003cversion\u003e0.4.0\u003c/version\u003e\n  \u003cexecutions\u003e\n    \u003cexecution\u003e\n      \u003cgoals\u003e\n        \u003cgoal\u003egenerate\u003c/goal\u003e\n      \u003c/goals\u003e\n      \u003cphase\u003egenerate-sources\u003c/phase\u003e\n      \u003cconfiguration\u003e\n        \u003cdestDir\u003e${project.build.directory}/generated-sources/jsonx\u003c/destDir\u003e\n        \u003cprefix\u003ecom.example.json.\u003c/prefix\u003e\n        \u003cschemas\u003e\n          \u003cschema\u003esrc/main/resources/schema.jsd\u003c/schema\u003e \u003c!-- or schema.jsdx --\u003e\n        \u003c/schemas\u003e\n      \u003c/configuration\u003e\n    \u003c/execution\u003e\n  \u003c/executions\u003e\n\u003c/plugin\u003e\n```\n\n### \u003cb\u003e8.4\u003c/b\u003e Specification\n\n_For a detailed specification of the Maven plugin, see **[\u003cins\u003eJSONx Maven Plugin\u003c/ins\u003e][jsonx-maven-plugin]**._\n\n## \u003cb\u003e9\u003c/b\u003e \u003cins\u003eJsonXml\u003c/ins\u003e\n\nOffers facilities for converting JSON documents to XML, and vice-versa.\n\n### \u003cb\u003e9.1\u003c/b\u003e Purpose\n\nProvide an encoding of JSON documents in an analogous form that uses XML semantics, referred to as \u003cins\u003eJsonXml documents\u003c/ins\u003e.\n\n### \u003cb\u003e9.2\u003c/b\u003e Requirements\n\n1. The \u003cins\u003eJsonXml documents\u003c/ins\u003e MUST be able to represent any and all legal JSON documents, as specified by [RFC2119](https://www.ietf.org/rfc/rfc2119.txt).\n\n1. The \u003cins\u003eJsonXml documents\u003c/ins\u003e MUST be translatable to JSON documents, and vice versa, preserving all normative and non-normative features of the original document.\n\n1. The \u003cins\u003eJsonXml documents\u003c/ins\u003e MUST provide meaningful and useful validation features via XSD validation.\n\n### \u003cb\u003e9.3\u003c/b\u003e Getting Started\n\nThe \u003cins\u003eJsonXml\u003c/ins\u003e sub-project provides convenience utilities for converting JSON documents to XML. The following illustrates example usage of the `JxConverter` class.\n\n#### \u003cb\u003e9.3.1\u003c/b\u003e JSON-to-XML\n\n```java\nString xml = JxConverter.jsonToXml(new JsonReader(new FileReader(\"example.json\")));\n```\n\n#### \u003cb\u003e9.3.2\u003c/b\u003e XML-to-JSON\n\n```java\nString json = JxConverter.xmlToJson(new FileInputStream(\"example.xml\"));\n```\n\n### \u003cb\u003e9.4\u003c/b\u003e Specification\n\n_For a detailed specification of JsonXml, see **[\u003cins\u003eJsonXml\u003c/ins\u003e][jsonxml]**._\n\n## \u003cb\u003e10\u003c/b\u003e \u003cins\u003eContributing\u003c/ins\u003e\n\nPull requests are welcome. For major changes, please [open an issue](../../issues) first to discuss what you would like to change.\n\nPlease make sure to update tests as appropriate.\n\n## \u003cb\u003e11\u003c/b\u003e \u003cins\u003eSpecial Thanks\u003c/ins\u003e\n\n[![Java Profiler](https://www.ej-technologies.com/images/product_banners/jprofiler_small.png)](https://www.ej-technologies.com/products/jprofiler/overview.html)\n\u003cbr\u003e\u003csub\u003e_Special thanks to [EJ Technologies](https://www.ej-technologies.com/) for providing their award winning Java Profiler ([JProfiler](https://www.ej-technologies.com/products/jprofiler/overview.html)) for development of the JSONx Framework._\u003c/sub\u003e\n\n## \u003cb\u003e12\u003c/b\u003e License\n\nThis project is licensed under the MIT License - see the [LICENSE.txt](LICENSE.txt) file for details.\n\n[#runtime]: #4-jsonx-runtime-api\n[#converter]: #532-converter\n[#invoice-example]: #43-getting-started\n[#jsd]: #3-json-schema-definition-language\n\n[runtime]: runtime\n[generator]: generator\n[validator]: validator\n[jaxrs]: jaxrs\n[jsonx-maven-plugin]: jsonx-maven-plugin\n[jsonxml]: jsonxml\n[sample-cdc]: sample/cdc\n[sample-invoice]: sample/invoice\n[sample]: sample\n[schema]: ../../../schema/\n\n[cdc]: http://martinfowler.com/articles/consumerDrivenContracts.html\n[oxygenxml]: https://www.oxygenxml.com/xml_editor/download_oxygenxml_editor.html\n[xmlschema]: http://www.w3.org/2001/XMLSchema","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjsonx-org%2Fjava","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjsonx-org%2Fjava","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjsonx-org%2Fjava/lists"}