Dev.to WebDev 🛠 Dev 👁 0 📖 2 min read

How to Deep Merge JSON Files Safely in the Browser (100% Client-Side)

We've all been there: It's Friday at 4:55 PM. You just need to merge two simple .json config files for deployment. "This will take 30 seconds," you whisper — a naive lie to yourself. Flash forward 3 hours later: You're

We've all been there: It's Friday at 4:55 PM. You just need to merge two simple .json config files for deployment.

"This will take 30 seconds," you whisper — a naive lie to yourself.

Flash forward 3 hours later: You're staring blankly at a screen full of missing commas, silently questioning your life choices. 💀

Here is the tragic 3-act story of every developer who has ever tried to merge JSON files by hand.

Act I: "I'll just use Object.assign()!"

You open config.old.json and config.new.json. You want to update an endpoint while keeping your default timeout settings.

const target = {
  api: { endpoint: "/v1", timeout: 5000 },
  features: { darkmode: true }
};

const source = {
  api: { endpoint: "/v2" } // missing timeout!
};

// Shallow merge using Object.assign():
const result = Object.assign({}, target, source);

console.log(result);
/*
Output:
{
  api: { endpoint: "/v2" }, // ❌ timeout: 5000 is GONE!
  features: { darkmode: true }
}
*/

The Pain: Because Object.assign() and spread operators perform a shallow merge, the top-level api object was completely overwritten. Your timeout key was wiped out silently, your dev build crashed, and your coffee is now freezing cold. 🪦

Act II: "I'll use an online merger!"

Desperate, you open Google and paste your internal API configurations and localized client settings into the first online-json-merger-free.com site you find.

Suddenly, a cold sweat hits you:

"Wait... did I just send our production database keys and API tokens to a server hosted in someone's basement?" 😳

The Paranoia: You spend the next hour rotating secret tokens and auditing git commits just to be safe.

Act III: Salvation (The 100% Local Deep Merge)

To save your Friday nights and preserve your sanity, here are two simple solutions that actually work:

Option A: The Vanilla JS Deep Merge

If you're writing code, stop using { ...a, ...b } for nested JSON. Use a recursive merge strategy instead:

function isObject(item) {
  return item && typeof item === "object" && !Array.isArray(item);
}

function deepMerge(target, source) {
  let output = Object.assign({}, target);

if (isObject(target) && isObject(source)) {
    Object.keys(source).forEach((key) => {
      if (isObject(source[key])) {
        if (!(key in target)) {
          Object.assign(output, { [key]: source[key] });
        } else {
          output[key] = deepMerge(target[key], source[key]);
        }
      } else {
        Object.assign(output, { [key]: source[key] });
      }
    });
  }
  return output;
}

// Now your nested keys survive! 🎉
const merged = deepMerge(target, source);
console.log(merged.api.timeout); // 5000

Option B: Use JoinJSON (Zero Server Uploads)

If you just want a fast visual tool to merge JSON files in 2 seconds without writing boilerplate or risking privacy, I built JoinJSON.

  • 🔒 100% Client-Side Privacy: All processing happens inside your browser's V8 engine. Zero bytes ever leave your machine.
  • 🧠 Smart Deep Merging: Intelligently combines nested properties without wiping out non-conflicting keys.
  • 🧹 Instant Validation: Highlights missing brackets, bad quotes, or trailing commas before they break your code.

🔗 Give your backspace key a break: https://www.joinjson.com/

💬 Over to you:

What is the most chaotic JSON syntax error or merge bug that has ever wasted your time? (Mine is definitely trailing commas inside arrays). Drop your horror stories below! 👇

📰 Read the original article on Dev.to WebDev

Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.