Original JSON
Enter original JSON.
Merge JSON files online. Review every highlighted change before you copy or download.
Compare two JSON documents side by side. Your data stays in your browser.
Enter original JSON.
Enter modified JSON.
Changes are labeled Added, Deleted, or Modified, with their JSON pointer paths. Object key order is ignored.
Enter two JSON documents, then select Compare JSON.
Comparison runs in this tab with no uploads or saved inputs. The comparison library loads from jsDelivr; your JSON is never sent there. Inputs are limited to 1 MB each.
Generate a schema from your JSON sample. Everything stays in your browser.
Enter JSON to generate a schema.
No uploads, API calls, or saved inputs. Schemas infer types from the supplied sample, not your full data model. Empty arrays use z.unknown(); mixed arrays use a union.
Generate interfaces or types from your JSON sample. Everything stays in your browser.
Enter JSON to generate TypeScript.
No uploads, API calls, or saved inputs. Types are inferred from this sample, not your full data model. Empty arrays use unknown; mixed arrays use unions. Non-object roots use a type alias in either mode.
Generate Pydantic models or standard dataclasses. Everything stays in your browser.
Enter JSON to generate Python models.
No uploads, API calls, or saved inputs. Models infer types from this sample only. Requires Python 3.9+. Arrays and primitive roots use a Root model with a value field. Empty arrays use Any; mixed arrays use unions. Optional types allow None and default all fields to None. Pydantic preserves renamed keys with aliases; dataclasses record original keys in field metadata but do not parse or validate JSON automatically.
Convert JSON to YAML or YAML to JSON. Everything stays in your browser.
Enter JSON to convert to YAML.
Conversion stays in this tab: no uploads or saved inputs. The YAML library loads from jsDelivr; your data is never sent there. Supports one YAML document with JSON-compatible values. Comments and formatting are not preserved; dates remain strings. Circular aliases, non-finite numbers, inputs over 1 MB, and excessive nesting or alias expansion are rejected.
Tab moves to the next control. Ctrl/Cmd+F opens Find in this editor. Escape closes Find. Ctrl/Cmd+Enter merges both inputs.
Must be a public HTTPS link with CORS enabled, up to 20 MB
Tab moves to the next control. Ctrl/Cmd+F opens Find in this editor. Escape closes Find. Ctrl/Cmd+Enter merges both inputs.
Must be a public HTTPS link with CORS enabled, up to 20 MB
If both have the same key, review conflicts below or keep the second JSON as the default winner.
Add valid JSON to both inputs to continue.
Ctrl / ⌘ + Enter to merge
Objects combine their keys. Other value types use the selected conflict choice. Arrays can be replaced, concatenated, or joined by a shared identifier.
Choose which value wins for each conflicting path. The result updates automatically.
Your JSON stays in this tab. Loading a URL contacts that source directly; no inputs are saved.
Use this JSON file merger to combine JSON files with explicit rules for conflicts. To merge multiple JSON files, combine two at a time and use each result as the next base. It is useful when you have a base configuration and an environment override, two exports containing related information, or a small update that needs to be applied to an existing document. JoinJson gives you a place to inspect both inputs and the result before you copy anything back into your project. Start by keeping untouched copies of your source files: a merge can be valid JSON without being the right data for your application.
Put your base document in First JSON and your update in Second JSON. Order matters because the second input wins when values conflict. For example, if the first document sets a user’s role to “Designer” and the second sets it to “Developer”, the result uses “Developer”. Keys that exist only in the first object are retained when the containing objects are combined, and new keys from the second object are added. Use Swap A ↔ B if you need to reverse that priority, then merge again to see the new result.
The Paste tab is the simplest choice for a short snippet. Paste a complete JSON value into the editor, rather than a JavaScript variable declaration or a Markdown code fence. JSON object keys and string values need double quotes, and trailing commas are not allowed. The Upload tab reads a local .json file when you drop it onto the zone or browse for it. File contents are read in your browser; selecting a file does not upload it to a JoinJson processing server. The filename and size help you confirm you selected the intended document.
The From URL tab fetches a document from a public HTTPS address. The source must allow browser access through Cross-Origin Resource Sharing, usually called CORS. Loading a URL contacts that source host, which may receive your IP address and the requested address. Avoid links containing passwords, access tokens, or confidential query parameters. Imports are limited to 20 MB. If loading fails, check the source URL and its access settings; downloading the file yourself and using Upload is an alternative when the host does not permit browser requests.
Each input has a live status badge. Empty means no document has been supplied, Valid JSON means the text can be parsed, and an error identifies a line to inspect. An error may originate just before the reported line, such as a missing comma or an unclosed string. The Format icon helps make a valid document easier to read, while Find locates a key or value and Wrap reduces horizontal scrolling. Validation checks JSON syntax, not your business rules: it cannot tell whether a product price or account identifier is correct.
Open Advanced options if you need to change how nested objects or arrays behave. To deep merge JSON, leave Deep merge enabled so matching nested objects are combined recursively. With deep merge disabled, a nested value supplied by the second object replaces the first value as a whole unless you choose a different conflict winner. Arrays are replaced by the second array by default. Concatenate appends the second array to the first, while Merge by ID lets you merge JSON by ID using the selected identifier field.
Select Merge JSON once both badges are valid, or press Ctrl/Cmd+Enter. Review the full-width Result panel rather than assuming a successful parse guarantees a suitable output. Subtle colors identify added keys and overridden values compared with the first document. Check important nested fields, list lengths, and any deliberately changed values. Very large documents have a bounded preview to keep the page responsive, but Copy and Download include the complete serialized result. Download .json saves a new file; it does not edit either original source.
After exporting, validate the result with any schema or application checks your project normally uses. JavaScript numbers can lose precision for very large integer identifiers, so keep such identifiers as strings where appropriate. Changing an input or a merge option clears the previous result so it cannot be mistaken for a current merge. Clear all removes the working inputs from the interface. The homepage does not save your JSON in app storage, but clipboard history, downloaded files, and browser extensions remain outside the tool’s control.
A deep merge combines matching objects one level at a time. A second value replaces a conflicting first value unless both are objects being combined or both are arrays handled by the selected array rule. Missing keys are preserved; null is a value, not an instruction to delete a key.
First JSON:
{"profile": {"name": "Ana", "theme": "light"}, "active": true}
Second JSON:
{"profile": {"theme": "dark"}, "city": "Chennai"}
{
"profile": {"name": "Ana", "theme": "dark"},
"active": true,
"city": "Chennai"
}
The name survives because it has no conflicting update. The theme changes because the second value wins. With deep merge disabled, the entire profile becomes {"theme": "dark"}, so the nested name is no longer present. Read the deep versus shallow merge guide for more context.
No. Parsing, validation, merging, and result rendering run in your browser. Load from URL contacts the source host to obtain the document. Copy and Download export data only when you request them. See the Privacy Policy for hosting and advertising disclosures.
The second JSON wins a conflicting value. With deep merge enabled, matching objects are combined recursively first. Keys unique to the first object remain, and keys unique to the second are added. Swap the inputs to reverse priority.
Yes. Select Concatenate both to append items, or Merge by ID to join array objects that share a field such as id. Replace with second keeps the updated array only. In shallow object mode, a conflicting nested array is handled with the selected array rule.
A browser can display a page while still blocking another website from reading it. The source needs to permit CORS access, use HTTPS, return valid JSON, and stay within the 20 MB limit. Private endpoints requiring cookies are not supported. You can upload a downloaded .json file instead.
No. Colors explain differences from the first input: added keys and overridden values. They are not schema validation or an assessment of correctness. Review the changes against your intended update and run your project’s normal checks before using the output.