https://github.com/josephburnett/jd Skip to content Navigation Menu Toggle navigation Sign in * Product + Actions Automate any workflow + Packages Host and manage packages + Security Find and fix vulnerabilities + Codespaces Instant dev environments + GitHub Copilot Write better code with AI + Code review Manage code changes + Issues Plan and track work + Discussions Collaborate outside of code Explore + All features + Documentation + GitHub Skills + Blog * Solutions By size + Enterprise + Teams + Startups By industry + Healthcare + Financial services + Manufacturing By use case + CI/CD & Automation + DevOps + DevSecOps * Resources Topics + AI + DevOps + Security + Software Development + View all Explore + Learning Pathways + White papers, Ebooks, Webinars + Customer Stories + Partners * Open Source + GitHub Sponsors Fund open source developers + The ReadME Project GitHub community articles Repositories + Topics + Trending + Collections * Enterprise + Enterprise platform AI-powered developer platform Available add-ons + Advanced Security Enterprise-grade security features + GitHub Copilot Enterprise-grade AI features + Premium Support Enterprise-grade 24/7 support * Pricing Search or jump to... Search code, repositories, users, issues, pull requests... Search [ ] Clear Search syntax tips Provide feedback We read every piece of feedback, and take your input very seriously. [ ] [ ] Include my email address so I can be contacted Cancel Submit feedback Saved searches Use saved searches to filter your results more quickly Name [ ] Query [ ] To see all available qualifiers, see our documentation. Cancel Create saved search Sign in Sign up Reseting focus You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert {{ message }} josephburnett / jd Public * Notifications You must be signed in to change notification settings * Fork 40 * Star 835 JSON diff and patch License MIT license 835 stars 40 forks Branches Tags Activity Star Notifications You must be signed in to change notification settings * Code * Issues 13 * Pull requests 1 * Actions * Projects 0 * Security * Insights Additional navigation options * Code * Issues * Pull requests * Actions * Projects * Security * Insights josephburnett/jd This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository. master BranchesTags Go to file Code Folders and files Name Name Last commit Last commit message date Latest commit History 378 Commits .github/workflows .github/ workflows doc doc lib lib v2 v2 vendor vendor web web .gitignore .gitignore .tool-versions .tool-versions Dockerfile Dockerfile LICENSE LICENSE Makefile Makefile README.md README.md RELEASE_NOTES.md RELEASE_NOTES.md ebnf.png ebnf.png fuzz-1bn.png fuzz-1bn.png go.mod go.mod go.sum go.sum logo.png logo.png logo_small.png logo_small.png main.go main.go main_test.go main_test.go View all files Repository files navigation * README * MIT license Go Report Card JSON diff and patch jd is a commandline utility and Go library for diffing and patching JSON and YAML values. It supports a native jd format (similar to unified format) as well as JSON Merge Patch (RFC 7386) and a subset of JSON Patch (RFC 6902). Try it out at http://play.jd-tool.io/. jd logo Installation To get the jd commandline utility: * run brew install jd, or * run go install github.com/josephburnett/jd@latest, or * visit https://github.com/josephburnett/jd/releases/latest and download the pre-built binary for your architecture/os, or * run in a Docker image jd(){ docker run --rm -i -v $PWD:$PWD -w $PWD josephburnett/jd "$@"; }. To use the jd web UI: * visit http://play.jd-tool.io/, or * run jd -port 8080 and visit http://localhost:8080. Command line usage Usage: jd [OPTION]... FILE1 [FILE2] Diff and patch JSON files. Prints the diff of FILE1 and FILE2 to STDOUT. When FILE2 is omitted the second input is read from STDIN. When patching (-p) FILE1 is a diff. Options: -color Print color diff. -p Apply patch FILE1 to FILE2 or STDIN. -o=FILE3 Write to FILE3 instead of STDOUT. -set Treat arrays as sets. -mset Treat arrays as multisets (bags). -setkeys Keys to identify set objects -yaml Read and write YAML instead of JSON. -port=N Serve web UI on port N -f=FORMAT Produce diff in FORMAT "jd" (default), "patch" (RFC 6902) or "merge" (RFC 7386) -t=FORMATS Translate FILE1 between FORMATS. Supported formats are "jd", "patch" (RFC 6902), "merge" (RFC 7386), "json" and "yaml". FORMATS are provided as a pair separated by "2". E.g. "yaml2json" or "jd2patch". Examples: jd a.json b.json cat b.json | jd a.json jd -o patch a.json b.json; jd patch a.json jd -set a.json b.json jd -f patch a.json b.json jd -f merge a.json b.json Command Line Option Details setkeys This option determines what keys are used to decide if two objects 'match'. Then the matched objects are compared, which will return a diff if there are differences in the objects themselves, their keys and/or values. You shouldn't expect this option to mask or ignore non-specified keys, it is not intended as a way to 'ignore' some differences between objects. Library usage Note: import only release commits (v1.Y.Z) because master can be unstable. import ( "fmt" jd "github.com/josephburnett/jd/lib" ) func ExampleJsonNode_Diff() { a, _ := jd.ReadJsonString(`{"foo":"bar"}`) b, _ := jd.ReadJsonString(`{"foo":"baz"}`) fmt.Print(a.Diff(b).Render()) // Output: // @ ["foo"] // - "bar" // + "baz" } func ExampleJsonNode_Patch() { a, _ := jd.ReadJsonString(`["foo"]`) diff, _ := jd.ReadDiffString(`` + `@ [1]` + "\n" + `+ "bar"` + "\n") b, _ := a.Patch(diff) fmt.Print(b.Json()) // Output: // ["foo","bar"] } Diff language Railroad diagram of EBNF * A diff is zero or more sections * Sections start with a @ header and the path to a node * A path is a JSON list of zero or more elements accessing collections * A JSON number element (e.g. 0) accesses an array * A JSON string element (e.g. "foo") accesses an object * An empty JSON object element ({}) accesses an array as a set or multiset * After the path is one or more removals or additions, removals first * Removals start with - and then the JSON value to be removed * Additions start with + and then the JSON value to added EBNF Diff ::= ( '@' '[' ( 'JSON String' | 'JSON Number' | 'Empty JSON Object' )* ']' '\n' ( ( '-' 'JSON Value' '\n' )+ | '+' 'JSON Value' '\n' ) ( '+' 'JSON Value' '\n' )* )* Examples @ ["a"] - 1 + 2 @ [2] + {"foo":"bar"} @ ["Movies",67,"Title"] - "Dr. Strangelove" + "Dr. Evil Love" @ ["Movies",67,"Actors","Dr. Strangelove"] - "Peter Sellers" + "Mike Myers" @ ["Movies",102] + {"Title":"Austin Powers","Actors":{"Austin Powers":"Mike Myers"}} @ ["Movies",67,"Tags",{}] - "Romance" + "Action" + "Comedy" Cookbook Use git diff to produce a structural diff: git difftool -yx jd @ -- foo.json @ ["foo"] - "bar" + "baz" See what changes in a Kubernetes Deployment: kubectl get deployment example -oyaml > a.yaml kubectl edit deployment example # change cpu resource from 100m to 200m kubectl get deployment example -oyaml | jd -yaml a.yaml output: @ ["metadata","annotations","deployment.kubernetes.io/revision"] - "2" + "3" @ ["metadata","generation"] - 2 + 3 @ ["metadata","resourceVersion"] - "4661" + "5179" @ ["spec","template","spec","containers",0,"resources","requests","cpu"] - "100m" + "200m" @ ["status","conditions",1,"lastUpdateTime"] - "2021-12-23T09:40:39Z" + "2021-12-23T09:41:49Z" @ ["status","conditions",1,"message"] - "ReplicaSet \"nginx-deployment-787d795676\" has successfully progressed." + "ReplicaSet \"nginx-deployment-795c7f5bb\" has successfully progressed." @ ["status","observedGeneration"] - 2 + 3 apply these change to another deployment: # edit file "patch" to contain only the hunk updating cpu request kubectl patch deployment example2 --type json --patch "$(jd -t jd2patch ~/patch)" About JSON diff and patch Topics yaml diff json patch Resources Readme License MIT license Activity Stars 835 stars Watchers 5 watching Forks 40 forks Report repository Releases 16 v1.9.1 Latest Aug 19, 2024 + 15 releases Packages 0 No packages published Contributors 10 * @josephburnett * @aftab-a * @kevburnsjr * @JeffFaer * @wafuwafu13 * @duallain * @tmcgilchrist * @adatoo * @neutralino * @Benjamin-Loison Languages * Go 97.0% * HTML 1.8% * Makefile 1.1% * Dockerfile 0.1% Footer (c) 2024 GitHub, Inc. Footer navigation * Terms * Privacy * Security * Status * Docs * Contact * Manage cookies * Do not share my personal information You can't perform that action at this time.