{"id":29191485,"url":"https://github.com/ostrowr/jsoncompat","last_synced_at":"2026-02-04T06:11:53.442Z","repository":{"id":302220904,"uuid":"918730954","full_name":"ostrowr/jsoncompat","owner":"ostrowr","description":"Escape version skew","archived":false,"fork":false,"pushed_at":"2025-12-31T21:42:49.000Z","size":2072,"stargazers_count":11,"open_issues_count":2,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-21T00:22:53.283Z","etag":null,"topics":["compatibility","json","json-schema","python","rust","skew","version-skew","wasm"],"latest_commit_sha":null,"homepage":"https://jsoncompat.com","language":"Rust","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/ostrowr.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-01-18T17:55:52.000Z","updated_at":"2026-01-18T04:19:41.000Z","dependencies_parsed_at":"2025-07-01T07:42:21.019Z","dependency_job_id":"84aa388d-d683-4202-a835-eef90b4c3411","html_url":"https://github.com/ostrowr/jsoncompat","commit_stats":null,"previous_names":["ostrowr/jsoncompat"],"tags_count":83,"template":false,"template_full_name":null,"purl":"pkg:github/ostrowr/jsoncompat","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ostrowr%2Fjsoncompat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ostrowr%2Fjsoncompat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ostrowr%2Fjsoncompat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ostrowr%2Fjsoncompat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ostrowr","download_url":"https://codeload.github.com/ostrowr/jsoncompat/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ostrowr%2Fjsoncompat/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29072778,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-04T03:31:03.593Z","status":"ssl_error","status_checked_at":"2026-02-04T03:29:50.742Z","response_time":62,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["compatibility","json","json-schema","python","rust","skew","version-skew","wasm"],"created_at":"2025-07-02T01:01:01.671Z","updated_at":"2026-02-04T06:11:53.428Z","avatar_url":"https://github.com/ostrowr.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![jsoncompat logo](web/jsoncompatdotcom/public/logo192.png)](https://jsoncompat.com)\n\n# jsoncompat\n\n[![crates.io](https://img.shields.io/crates/v/jsoncompat)](https://crates.io/crates/jsoncompat) [![docs.rs](https://docs.rs/jsoncompat/badge.svg)](https://docs.rs/jsoncompat) [![PyPI](https://img.shields.io/pypi/v/jsoncompat.svg)](https://pypi.org/project/jsoncompat/) [![npm](https://img.shields.io/npm/v/jsoncompat.svg)](https://www.npmjs.com/package/jsoncompat) [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n\nCheck compatibility of evolving JSON schemas.\n\n\u003e [!WARNING]\n\u003e Docs and examples at [jsoncompat.com](https://jsoncompat.com)\n\u003e\n\u003e This is alpha software. Not all incompatible changes are detected, and there may be false positives. Contributions are welcome!\n\nImagine you have an API that returns some JSON data, or JSON that you're storing in a database or file. You need to ensure that new code can read old data and that old code can read new data.\n\nIt's difficult to version JSON schemas in a traditional sense, because they can break in two directions:\n\n1. If a schema is used by the party generating the data, or \"serializer\", then a change to the schema that can break clients using an older version of the schema should be considered \"breaking.\" For example, removing a required property from a serializer schema should be considered a breaking change for a schema with the serializer role.\n\nMore formally, consider a serializer schema $S_A$ which is changed to $S_B$. This change should be considered breaking if there exists some JSON value that is valid against $S_B$ but invalid against $S_A$.\n\nAs a concrete example, if you're a webserver that returns JSON data with the following schema:\n\n```json\n{\n  \"type\": \"object\",\n  \"properties\": {\n    \"id\": { \"type\": \"integer\" },\n    \"name\": { \"type\": \"string\" }\n  },\n  \"required\": [\"id\", \"name\"]\n}\n```\n\nand you make `name` optional:\n\n```json\n{\n  \"type\": \"object\",\n  \"properties\": {\n    \"id\": { \"type\": \"integer\" },\n    \"name\": { \"type\": \"string\" }\n  },\n  \"required\": [\"id\"]\n}\n```\n\nthen you've made a breaking change for any client that is using the old schema.\n\nWe assume that the serializer will not write additional properties that are not in the schema, even if additionalProperties is true. This allows us to consider a change to the schema that adds an optional property of some type not to be a breaking change.\n\n1. If a schema is used by a party receiving the data, or \"deserializer\", then a change to the schema that might fail to deserialize existing data should be considered \"breaking.\" For example, adding a required property to a deserializer should be considered a breaking change.\n\nMore formally, consider a deserializer schema $S_A$ which is changed to $S_B$. This change should be considered breaking if there exists some JSON value that is valid against $S_A$ but invalid against $S_B$.\n\nAs a concrete example, imagine that you've been writing code that saves JSON data to a databse with the following schema:\n\n```json\n{\n  \"type\": \"object\",\n  \"properties\": {\n    \"id\": { \"type\": \"integer\" },\n    \"name\": { \"type\": \"string\" }\n  },\n  \"required\": [\"id\"]\n}\n```\n\nand you make `name` required, attempting to load that data into memory by deserializing it with the following schema:\n\n```json\n{\n  \"type\": \"object\",\n  \"properties\": {\n    \"id\": { \"type\": \"integer\" },\n    \"name\": { \"type\": \"string\" }\n  },\n  \"required\": [\"id\", \"name\"]\n}\n```\n\nyou'll be unable to deserialize any data that doesn't have a `name` property, which is a breaking change for the `deserializer` role.\n\nIf a schema is used by both a serializer and a deserializer, then a change to the schema that can break either should be considered \"breaking.\"\n\n## Development\n\nRequirements:\n\nRun [bootstrap.sh](bootstrap.sh) to install the necessary dependencies.\n\nRun tests:\n\n```bash\njust check\n```\n\nSee the [Justfile](Justfile) for more commands\n\n## Releasing\n\n`just release` will dry-run the release process for a patch release.\n\nRight now, releases to PyPI and npm are done in CI via manual dispatch of the `CI` workflow\non a tag. Releases to cargo are done manually for now.\n\nMerging to main will trigger a release of the website.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fostrowr%2Fjsoncompat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fostrowr%2Fjsoncompat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fostrowr%2Fjsoncompat/lists"}