{"id":25876526,"url":"https://github.com/filip26/titanium-jcs","last_synced_at":"2026-05-13T00:02:14.493Z","repository":{"id":278614510,"uuid":"936206869","full_name":"filip26/titanium-jcs","owner":"filip26","description":"Deterministic JSON serialization and canonical equality. RFC 8785 JCS","archived":false,"fork":false,"pushed_at":"2026-03-11T22:27:35.000Z","size":181,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-12T03:22:25.627Z","etag":null,"topics":["canonical","canonicalization","canonicalize","canonize","equality","jackson-databind","jakarta-json-api","jcs","json"],"latest_commit_sha":null,"homepage":"https://apicatalog.com","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/filip26.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["filip26"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":["https://wise.com/share/filipk558","https://paypal.me/FilipKolarik"]}},"created_at":"2025-02-20T17:43:18.000Z","updated_at":"2026-03-11T22:22:20.000Z","dependencies_parsed_at":null,"dependency_job_id":"5e101ecb-29b8-4f23-9188-787ecbe66677","html_url":"https://github.com/filip26/titanium-jcs","commit_stats":null,"previous_names":["filip26/titanium-jcs"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/filip26/titanium-jcs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/filip26%2Ftitanium-jcs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/filip26%2Ftitanium-jcs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/filip26%2Ftitanium-jcs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/filip26%2Ftitanium-jcs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/filip26","download_url":"https://codeload.github.com/filip26/titanium-jcs/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/filip26%2Ftitanium-jcs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32961785,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-12T23:30:32.555Z","status":"ssl_error","status_checked_at":"2026-05-12T23:30:18.191Z","response_time":102,"last_error":"SSL_read: 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":["canonical","canonicalization","canonicalize","canonize","equality","jackson-databind","jakarta-json-api","jcs","json"],"created_at":"2025-03-02T10:29:51.485Z","updated_at":"2026-05-13T00:02:14.488Z","avatar_url":"https://github.com/filip26.png","language":"Java","funding_links":["https://github.com/sponsors/filip26","https://wise.com/share/filipk558","https://paypal.me/FilipKolarik"],"categories":[],"sub_categories":[],"readme":"# Titanium JCS\n\n\n[![Java 21 CI](https://github.com/filip26/titanium-jcs/actions/workflows/java21-build.yml/badge.svg)](https://github.com/filip26/titanium-jcs/actions/workflows/java21-build.yml)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/af8879b14a3f45bd8205c7720a24612f)](https://app.codacy.com/gh/filip26/titanium-jcs/dashboard?utm_source=gh\u0026utm_medium=referral\u0026utm_content=\u0026utm_campaign=Badge_grade)\n[![Codacy Badge](https://app.codacy.com/project/badge/Coverage/af8879b14a3f45bd8205c7720a24612f)](https://app.codacy.com/gh/filip26/titanium-jcs/dashboard?utm_source=gh\u0026utm_medium=referral\u0026utm_content=\u0026utm_campaign=Badge_coverage)\n[![javadoc](https://javadoc.io/badge2/com.apicatalog/titanium-jcs/javadoc.svg)](https://javadoc.io/doc/com.apicatalog/titanium-jcs)\n[![Maven Central](https://img.shields.io/maven-central/v/com.apicatalog/titanium-jcs.svg?label=Maven%20Central)](https://search.maven.org/search?q=g:com.apicatalog%20AND%20a:titanium-jcs)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n\n\nThe JSON Canonicalization Scheme (JCS) defines a deterministic way to serialize JSON so that the same JSON data model always produces the same byte sequence.  \n\nThis is critical for use cases such as digital signatures, hashing, and data integrity verification, where even small differences in whitespace, member ordering, or number formatting would otherwise break validation.  \n\nBy normalizing JSON into a canonical form, JCS ensures interoperability across systems and guarantees stable, repeatable representations of data.  \n\nTitanium JCS is a Java implementation of the [RFC 8785 JSON Canonicalization Scheme (JCS)](https://www.rfc-editor.org/rfc/rfc8785).\n\n\u003e 📝 Note: Handling decimals in JSON is a known challenge, and certain corner cases may not behave as expected. JCS adheres to ECMAScript’s number handling, which can reflect these limitations with decimal values.\n\n\n## ✨ Features\n\n- **Non-recursive Canonical JSON Writer**  \n  Deterministically serializes JSON values into a stable, repeatable form \n  following [RFC 8785](https://www.rfc-editor.org/rfc/rfc8785).  \n\n- **Canonical JSON Equality Comparator**  \n  Compares JSON values for equality under JCS rules, ensuring numbers, objects, \n  and arrays are compared in their canonical form rather than raw text.\n  \n- **Uniform, JSON Library-Agnostic API**  \n  Built on a uniform [Tree I/O API](https://github.com/filip26/tree-io) for JSON data processing.  \n  Jackson and Jakarta are supported out of the box.\n\n## Example\n\n```javascript\n// Canonicalize a JSON value and return the canonical string\nvar canonicalJson = Jcs.canonize(json, adapter);\n\n// Canonicalize a JSON value and write canonical JSON to a writer\nJcs.canonize(json, adapter, writer);\n\n// Compare two JSON values for canonical equality\nif (Jcs.equals(json1, json2, adapter)) {\n  // values are equal under RFC 8785 rules\n}\n```\n\n\n## 📦 Installation\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.apicatalog\u003c/groupId\u003e\n    \u003cartifactId\u003etitanium-jcs\u003c/artifactId\u003e\n    \u003cversion\u003e${titanium-jcs.version}\u003c/version\u003e\n\u003c/dependency\u003e\n\n\u003c!-- Include at least one Tree I/O JSON adapter --\u003e\n\n\u003c!-- Jackson 2 --\u003e\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.apicatalog\u003c/groupId\u003e\n    \u003cartifactId\u003etree-io-jackson2\u003c/artifactId\u003e\n    \u003cversion\u003e${tree-io.version}\u003c/version\u003e\n\u003c/dependency\u003e\n\n\u003c!-- Jakarta (JSONP) --\u003e\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.apicatalog\u003c/groupId\u003e\n    \u003cartifactId\u003etree-io-jakarta\u003c/artifactId\u003e\n    \u003cversion\u003e${tree-io.version}\u003c/version\u003e\n\u003c/dependency\u003e\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.glassfish\u003c/groupId\u003e\n    \u003cartifactId\u003ejakarta.json\u003c/artifactId\u003e\n    \u003cversion\u003e2.0.1\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n## 🛠️ LD-CLI\n[LD-CLI](https://github.com/filip26/ld-cli) is a command-line utility for\nworking with JSON, JSON-LD, CBOR-LD, multiformats, and related specifications.\n\nIt provides encoding, decoding, detection, analysis, and format conversion\nfeatures, making it useful for inspecting identifiers, testing content\naddressing, and integrating multiformats into development workflows.\n\n### Example\n\nCanonicalize JSON and write canonical JSON to stdout\n\n```bash\ncat test.json | ld-cli jcs\n```\n\n## 🤝 Contributing\n\nContributions are welcome! Please submit a pull request.\n\n\n### Building\n\nFork and clone the repository, then build with Maven:\n\n```bash\n\u003e cd titanium-jcs\n\u003e mvn package\n```\n\n\n## Resources\n\n- [RFC 8785 JSON Canonicalization Scheme (JCS)](https://www.rfc-editor.org/rfc/rfc8785)\n- [JSON Canonicalization Scheme (JCS)](https://github.com/cyberphone/json-canonicalization)\n- [Tree I/O](https://github.com/filip26/tree-io)\n- [Titanium RDF Canon](https://github.com/filip26/titanium-rdf-canon)\n- [LD-CLI](https://github.com/filip26/ld-cli)\n\n## 💼 Commercial Support\n\nCommercial support and consulting are available.  \nFor inquiries, please contact: filip26@gmail.com\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffilip26%2Ftitanium-jcs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffilip26%2Ftitanium-jcs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffilip26%2Ftitanium-jcs/lists"}