{"id":20364099,"url":"https://github.com/ekino/jcv","last_synced_at":"2025-04-12T04:33:06.950Z","repository":{"id":56294892,"uuid":"163856313","full_name":"ekino/jcv","owner":"ekino","description":"JSON Content Validator (JCV) allows you to compare JSON contents with embedded validation.","archived":false,"fork":false,"pushed_at":"2024-10-07T08:27:19.000Z","size":418,"stargazers_count":21,"open_issues_count":2,"forks_count":0,"subscribers_count":22,"default_branch":"master","last_synced_at":"2025-03-26T00:03:54.131Z","etag":null,"topics":["assertions","assertj","assertj-assertions","hamcrest","hamcrest-matchers","java","jcv","json","jsonassert","testing","wiremock","wiremock-mappings"],"latest_commit_sha":null,"homepage":"https://ekino.github.io/jcv","language":"Kotlin","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/ekino.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-01-02T15:12:59.000Z","updated_at":"2024-10-07T08:27:23.000Z","dependencies_parsed_at":"2022-08-15T16:10:32.064Z","dependency_job_id":null,"html_url":"https://github.com/ekino/jcv","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ekino%2Fjcv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ekino%2Fjcv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ekino%2Fjcv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ekino%2Fjcv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ekino","download_url":"https://codeload.github.com/ekino/jcv/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248517351,"owners_count":21117436,"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":["assertions","assertj","assertj-assertions","hamcrest","hamcrest-matchers","java","jcv","json","jsonassert","testing","wiremock","wiremock-mappings"],"created_at":"2024-11-15T00:09:46.935Z","updated_at":"2025-04-12T04:33:06.931Z","avatar_url":"https://github.com/ekino.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# {#JCV#}\n\nJSON Content Validator (JCV) allows you to compare JSON contents with embedded validation.\n\n[![Build](https://github.com/ekino/jcv/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/ekino/jcv/actions/workflows/build.yml)\n[![GitHub (pre-)release](https://img.shields.io/github/release/ekino/jcv/all.svg)](https://github.com/ekino/jcv/releases)\n[![Maven Central](https://img.shields.io/maven-central/v/com.ekino.oss.jcv/jcv-core)](https://search.maven.org/search?q=g:com.ekino.oss.jcv)\n[![GitHub license](https://img.shields.io/github/license/ekino/jcv.svg)](https://github.com/ekino/jcv/blob/master/LICENSE.md)\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=ekino_jcv\u0026metric=alert_status)](https://sonarcloud.io/dashboard?id=ekino_jcv)\n\n## Table of contents\n\n* [Summary](#summary)\n* [Examples](#examples)\n* [Quick start](#quick-start)\n    * [Core module](#core-module)\n    * [AssertJ module](#assertj-module)\n    * [Hamcrest module](#hamcrest-module)\n    * [WireMock module](#wiremock-module)\n* [Learn more](#learn-more)\n\n\n## Summary\n\nMake a full json content assertion using the minimum amount of code using an expected JSON content with the possibility to add custom field validation.\n\nMake your tests light, easy to write, readable and exhaustive.\n\nThis tool is based on the very useful [JSONassert](https://github.com/skyscreamer/JSONassert) one and add the embedded validation system to assert unpredicatable values.\n\n## Examples\n\nThe actual JSON you want to validate :\n```json\n{\n    \"field_1\": \"some value\",\n    \"field_2\": \"3716a0cf-850e-46c3-bd97-ac1f34437c43\",\n    \"date\": \"2011-12-03T10:15:30Z\",\n    \"other_fields\": [{\n        \"id\": \"2\",\n        \"link\": \"https://another.url.com/my-base-path/query?param1=true\"\n    }, {\n        \"id\": \"1\",\n        \"link\": \"https://some.url.com\"\n    }]\n}\n```\n\nThe expected JSON with embedded validation :\n```json\n{\n   \"field_1\": \"some value\",\n   \"field_2\": \"{#uuid#}\",\n   \"date\": \"{#date_time_format:iso_instant#}\",\n   \"other_fields\": [{\n       \"id\": \"1\",\n       \"link\": \"{#url#}\"\n   }, {\n       \"id\": \"2\",\n       \"link\": \"{#url_ending:query?param1=true#}\"\n   }]\n}\n```\n\nMore examples available here : [ekino/jcv-examples](https://github.com/ekino/jcv-examples)\n\n## Quick start\n\n### Core module\n\nJCV add a new JSONComparator implementation to make the possibility to use validators inside the expected JSON,\nso it requires the [JSONassert](https://github.com/skyscreamer/JSONassert) dependency to work.\n\n#### Dependencies\n\nMaven\n```xml\n\u003cdependencies\u003e\n  ...\n  \u003cdependency\u003e\n    \u003cgroupId\u003eorg.skyscreamer\u003c/groupId\u003e\n    \u003cartifactId\u003ejsonassert\u003c/artifactId\u003e\n    \u003cversion\u003e1.5.3\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n  \u003c/dependency\u003e\n  \u003cdependency\u003e\n    \u003cgroupId\u003ecom.ekino.oss.jcv\u003c/groupId\u003e\n    \u003cartifactId\u003ejcv-core\u003c/artifactId\u003e\n    \u003cversion\u003e1.6.0-SNAPSHOT\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n  \u003c/dependency\u003e\n  ...\n\u003c/dependencies\u003e\n```\n\nGradle\n```groovy\ndependencies {\n  ...\n  testImplementation 'org.skyscreamer:jsonassert:1.5.3'\n  testImplementation 'com.ekino.oss.jcv:jcv-core:1.6.0-SNAPSHOT'\n  ...\n}\n```\n\nNote:\n\nDo not forget to add the maven snapshots repository for SNAPSHOT versions :\n\nMaven\n```xml\n\u003crepositories\u003e\n  ...\n  \u003crepository\u003e\n    \u003cid\u003emaven-snapshots\u003c/id\u003e\n    \u003curl\u003ehttp://oss.sonatype.org/content/repositories/snapshots\u003c/url\u003e\n    \u003clayout\u003edefault\u003c/layout\u003e\n    \u003creleases\u003e\n      \u003cenabled\u003efalse\u003c/enabled\u003e\n    \u003c/releases\u003e\n    \u003csnapshots\u003e\n      \u003cenabled\u003etrue\u003c/enabled\u003e\n    \u003c/snapshots\u003e\n  \u003c/repository\u003e\n  ...\n\u003c/repositories\u003e\n```\n\nGradle\n```groovy\nrepositories {\n    maven {\n        url = uri(\"https://oss.sonatype.org/content/repositories/snapshots/\")\n    }\n}\n```\n\n### AssertJ module\n\nA JCV module that supports [AssertJ](https://github.com/joel-costigliola/assertj-core).\n\n#### Example\n\n```java\nimport static com.ekino.oss.jcv.assertion.assertj.JsonCompareAssert.*;\n\n@Test\nvoid testContainsValidator() throws JSONException {\n    assertThatJson(\"{\\\"field_name\\\": \\\"hello world!\\\"}\")\n        .isValidAgainst(\"{\\\"field_name\\\": \\\"{#contains:llo wor#}\\\"}\");\n}\n```\n\n#### Dependencies\n\nMaven\n```xml\n\u003cdependencies\u003e\n  ...\n  \u003cdependency\u003e\n    \u003cgroupId\u003eorg.skyscreamer\u003c/groupId\u003e\n    \u003cartifactId\u003ejsonassert\u003c/artifactId\u003e\n    \u003cversion\u003e1.5.3\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n  \u003c/dependency\u003e\n  \u003cdependency\u003e\n    \u003cgroupId\u003eorg.assertj\u003c/groupId\u003e\n    \u003cartifactId\u003eassertj-core\u003c/artifactId\u003e\n    \u003cversion\u003e3.26.3\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n  \u003c/dependency\u003e\n  \u003cdependency\u003e\n    \u003cgroupId\u003ecom.ekino.oss.jcv\u003c/groupId\u003e\n    \u003cartifactId\u003ejcv-assertj\u003c/artifactId\u003e\n    \u003cversion\u003e1.6.0-SNAPSHOT\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n  \u003c/dependency\u003e\n  ...\n\u003c/dependencies\u003e\n```\n\nGradle\n```groovy\ndependencies {\n  ...\n  testImplementation 'org.skyscreamer:jsonassert:1.5.3'\n  testImplementation 'org.assertj:assertj-core:3.26.3'\n  testImplementation 'com.ekino.oss.jcv:jcv-assertj:1.6.0-SNAPSHOT'\n  ...\n}\n```\n\n### Hamcrest module\n\nA JCV module that supports [Hamcrest](https://github.com/hamcrest/JavaHamcrest).\n\n#### Example\n\n```java\nimport static com.ekino.oss.jcv.assertion.hamcrest.JsonMatchers.*;\nimport static org.hamcrest.MatcherAssert.*;\n\n@Test\nvoid testContainsValidator() throws JSONException {\n    assertThat(\n        \"{\\\"field_name\\\": \\\"hello world!\\\"}\",\n        jsonMatcher(\"{\\\"field_name\\\": \\\"{#contains:llo wor#}\\\"}\")\n    );\n}\n```\n\n#### Dependencies\n\nMaven\n```xml\n\u003cdependencies\u003e\n  ...\n  \u003cdependency\u003e\n    \u003cgroupId\u003eorg.skyscreamer\u003c/groupId\u003e\n    \u003cartifactId\u003ejsonassert\u003c/artifactId\u003e\n    \u003cversion\u003e1.5.3\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n  \u003c/dependency\u003e\n  \u003cdependency\u003e\n    \u003cgroupId\u003eorg.hamcrest\u003c/groupId\u003e\n    \u003cartifactId\u003ehamcrest\u003c/artifactId\u003e\n    \u003cversion\u003e3.0\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n  \u003c/dependency\u003e\n  \u003cdependency\u003e\n    \u003cgroupId\u003ecom.ekino.oss.jcv\u003c/groupId\u003e\n    \u003cartifactId\u003ejcv-hamcrest\u003c/artifactId\u003e\n    \u003cversion\u003e1.6.0-SNAPSHOT\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n  \u003c/dependency\u003e\n  ...\n\u003c/dependencies\u003e\n```\n\nGradle\n```groovy\ndependencies {\n  ...\n  testImplementation 'org.skyscreamer:jsonassert:1.5.3'\n  testImplementation 'org.hamcrest:hamcrest:3.0'\n  testImplementation 'com.ekino.oss.jcv:jcv-hamcrest:1.6.0-SNAPSHOT'\n  ...\n}\n```\n\n### WireMock module\n\nA JCV module extension for [WireMock](http://wiremock.org/).\n\n#### Example\n\nRegister the extension on your WireMock server:\n```kotlin\nimport com.github.tomakehurst.wiremock.WireMockServer\nimport com.github.tomakehurst.wiremock.core.WireMockConfiguration\nimport com.ekino.oss.jcv.assertion.wiremock.JcvRequestMatcherExtension\n\nprivate val wireMockServer by lazy {\n  WireMockServer(\n    WireMockConfiguration()\n      .dynamicPort()\n      .extensions(JcvRequestMatcherExtension())\n  )\n}\n```\n\nThen you can stub via code:\n```kotlin\nimport com.github.tomakehurst.wiremock.client.WireMock.aResponse\nimport com.github.tomakehurst.wiremock.client.WireMock.post\nimport com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo\nimport com.ekino.oss.jcv.assertion.wiremock.JcvRequestMatcherExtension\n\nwireMockServer.stubFor(\n  post(urlEqualTo(\"/some_url\"))\n    .andMatching(\n      JcvRequestMatcherExtension.toRequestMatcher(\n        json =\n        \"\"\"\n        {\n          \"some_field\": \"{#not_empty#}\"\n        }\n        \"\"\"\n      )\n    )\n    .willReturn(\n      aResponse()\n        .withHeader(\"Content-Type\", \"text/plain\")\n        .withStatus(200)\n        .withBody(\"OK\")\n    )\n)\n```\n\nOr you can stub via mapping file:\n```json\n{\n  \"request\": {\n    \"method\": \"POST\",\n    \"url\": \"/some_url\",\n    \"customMatcher\": {\n      \"name\": \"equalToJcv\",\n      \"parameters\": {\n        \"json\": {\n          \"some_field\": \"{#not_empty#}\"\n        },\n        \"ignoreArrayOrder\": true,\n        \"ignoreExtraElements\": false\n      }\n    }\n  },\n  \"response\": {\n    \"status\": 200,\n    \"body\": \"OK\"\n  }\n}\n```\n\n#### Dependencies\n\nMaven\n```xml\n\u003cdependencies\u003e\n  ...\n  \u003cdependency\u003e\n    \u003cgroupId\u003eorg.skyscreamer\u003c/groupId\u003e\n    \u003cartifactId\u003ejsonassert\u003c/artifactId\u003e\n    \u003cversion\u003e1.5.3\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n  \u003c/dependency\u003e\n  \u003cdependency\u003e\n    \u003cgroupId\u003eorg.wiremock\u003c/groupId\u003e\n    \u003cartifactId\u003ewiremock\u003c/artifactId\u003e\n    \u003cversion\u003e3.9.1\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n  \u003c/dependency\u003e\n  \u003cdependency\u003e\n    \u003cgroupId\u003ecom.ekino.oss.jcv\u003c/groupId\u003e\n    \u003cartifactId\u003ejcv-wiremock\u003c/artifactId\u003e\n    \u003cversion\u003e1.6.0-SNAPSHOT\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n  \u003c/dependency\u003e\n  ...\n\u003c/dependencies\u003e\n```\n\nGradle\n```groovy\ndependencies {\n  ...\n  testImplementation 'org.skyscreamer:jsonassert:1.5.3'\n  testImplementation 'org.wiremock:wiremock:3.9.1'\n  testImplementation 'com.ekino.oss.jcv:jcv-wiremock:1.6.0-SNAPSHOT'\n  ...\n}\n```\n\n## Learn more\n\nYou will find more information (validators, guided tours...) in the [Wiki](https://github.com/ekino/jcv/wiki).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fekino%2Fjcv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fekino%2Fjcv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fekino%2Fjcv/lists"}