টুল
গাইড

JSON পার্থক্য

JSON

দুটি JSON নথি তুলনা করে কাঠামোগত পার্থক্য তুলে ধরে।

100% ক্লায়েন্ট-সাইড কোনো ব্যাকএন্ড নেই
বাম (মূল)
ডান (পরিবর্তিত)
আউটপুট
এই পৃষ্ঠায়

JSON diff কী?#

একটি JSON diff দুটি JSON নথি তুলনা করে এবং আপনাকে সুনির্দিষ্টভাবে জানায় এদের মধ্যে কী পরিবর্তিত হয়েছে — কোন কোন ফিল্ড যুক্ত হয়েছে, কোনগুলো অদৃশ্য হয়েছে, এবং কোনগুলো একই পথ ধরে রেখেছে কিন্তু ভিন্ন মান নিয়েছে। এটি একটি টেক্সট diff-এর কাঠামোগত সমতুল্য, কিন্তু লাইন মেলানোর বদলে এটি অবজেক্ট ও অ্যারে ট্রি অতিক্রম করে, তাই 1 থেকে 2-এ চলে যাওয়া একটি মান টেক্সটের পুনর্লিখিত ব্লক হিসেবে নয়, একটি নির্দিষ্ট পথে একটি সুনির্দিষ্ট সম্পাদনা হিসেবে দেখা যায়।

এটি তখনই গুরুত্বপূর্ণ যখনই JSON এমন কিছুর ওয়্যার ফরম্যাট যা বিবর্তিত হয়: ডিপ্লয়ের মধ্যে API প্রতিক্রিয়া, সংশোধনের মধ্যে কনফিগ ফাইল, একটি টেস্ট স্যুটে ফিক্সচার, দিনের মধ্যে রপ্তানিকৃত ডেটা। পাশাপাশি দুটি প্রেটি-প্রিন্ট করা দলায় তাকিয়ে থাকা শুধুমাত্র ক্ষুদ্র নথির জন্যই কাজ করে; নেস্টিং গভীর হওয়ার সাথে সাথেই আপনাকে পার্থক্যগুলো গণনা করতে হয়।

ধারাবাহিকতার সমস্যা হলো JSON diff অ্যারের ক্রম-সংবেদনশীল। দুটি অ্যারে তখনই সমান যখন তাদের উপাদানগুলো অবস্থান অনুসারে মেলে, কারণ JSON নিজেই সমতা এভাবেই সংজ্ঞায়িত করে। তাই [a, b] এবং [b, a] ভিন্ন, এবং diff তা রিপোর্ট করবে — যখন ক্রম অর্থপূর্ণ তখন উপযোগী (ধাপের ক্রম), যখন নয় তখন অবাক করে (অ্যারে হিসেবে ছদ্মবেশী একটি সেট)।

ব্যবহারবিধি#

  1. মূল নথিটি বাম (মূল) পেইনে এবং সংশোধিত নথিটি ডান (পরিবর্তিত) পেইনে পেস্ট করুন।
  2. টাইপ করার সাথে সাথে তুলনা লাইভ চলে। জোর করে রিফ্রেশ করতে তুলনা ক্লিক করতে পারেন।
  3. আউটপুট এলিকাটি প্রতিটি পার্থক্য তার নিজস্ব সারিতে তালিকাভুক্ত করে:
    • যোগ হয়েছে — পথ শুধু ডানদিকে আছে; সারিটি নতুন মান দেখায়।
    • মুছে ফেলা হয়েছে — পথ শুধু বাঁদিকে আছে; সারিটি পুরোনো মান দেখায়।
    • পরিবর্তিত — পথ উভয় পাশে আছে কিন্তু ভিন্ন মান সহ; সারিটি পুরোনো → নতুন দেখায়। প্রতিটি সারির পূর্বে $.version বা $.tags[2]-এর মতো একটি JSONPath-স্টাইল পথ থাকে, যাতে আপনি যেকোনো একটি নথিতে এটি খুঁজে পান।
  4. যদি উভয় নথি গভীরভাবে সমান হয়, স্ট্যাটাস লাইনটি তা স্পষ্টভাবে বলে — “কোনো পার্থক্য নেই” — একটি খালি পেইন ব্যাখ্যা করার জন্য ফেলে না দিয়ে।
  5. নমুনা একটি বাস্তবসম্মত আগে/পরের জোড় লোড করে; মুছুন উভয় পেইন ও ফলাফল রিসেট করে।

মূল বৈশিষ্ট্য#

  • কাঠামোগত, টেক্সচুয়াল নয়। পার্স করা মান ট্রি তুলনা করে, তাই পুনরায় ইনডেন্ট, অবজেক্ট কী পুনর্বিন্যাস, বা হোয়াইটস্পেস পরিবর্তন কখনো মিথ্যা পার্থক্য তৈরি করে না।
  • সুনির্দিষ্ট পথ। প্রতিটি পরিবর্তন JSONPath প্রতীকে তার অবস্থান বহন করে — রুটের জন্য $, অবজেক্ট ফিল্ডের জন্য .key, অ্যারে সূচকের জন্য [i] — তাই আপনি সরাসরি সঠিক স্থানে লাফ দিতে পারেন।
  • তিন ধরনের পরিবর্তন। যোগ, মুছে ফেলা এবং পরিবর্তিত আলাদাভাবে রিপোর্ট করা হয় এবং রঙ-কোডেড, তাই এক নজরেই যোগগুলো মুছে ফেলা ও সম্পাদনা থেকে আলাদা হয়ে যায়।
  • প্রতি-পাশে ত্রুটি রিপোর্টিং। যদি একটি ইনপুট বৈধ JSON না হয়, স্ট্যাটাস লাইন কোন পাশটি ব্যর্থ হয়েছে তা নাম করে (বাম ইনপুট বৈধ JSON নয়।) অস্বচ্ছভাবে ব্যর্থ না হয়ে।
  • লাইভ তুলনা। আপনি যেকোনো পেইন এডিট করার সাথে সাথে diff আপডেট হয়, তাই একটি ফিক্সচার বা প্রতিক্রিয়ায় পুনরাবৃত্তি তাৎক্ষণিক।

ব্যবহারিক উদাহরণ#

নমুনা লোড করুন এবং দুটি পেইন একটি সংশোধনের আগে ও পরে একটি ছোট কনফিগ নথি দিয়ে পূর্ণ হয়:

{
  "name": "ArpGate",
  "version": 1,
  "tags": ["json", "encoding"],
  "features": { "static": true, "backend": null }
}

বাঁদিকে, এর বিপরীতে:

{
  "name": "ArpGate",
  "version": 2,
  "tags": ["json", "encoding", "crypto"],
  "features": { "static": true, "backend": false, "offline": true }
}

ডানদিকে। diff সুনির্দিষ্টভাবে কী সরেছে তা গণনা করে:

changed  $.version           1 → 2
added    $.tags[2]           "crypto"
changed  $.features.backend  null → false
added    $.features.offline  true

খেয়াল করুন কী যায় না: $.name (অপরিবর্তিত), $.tags[0] এবং $.tags[1] (অপরিবর্তিত), এবং $.features.static (অপরিবর্তিত)। সমান শাখাগুলো কোনো আউটপুট তৈরি করে না, তাই একটি চার-সারির diff হলো সম্পূর্ণ গল্প যদিও উভয় নথির বেশ কয়েকটি ফিল্ড আছে। এরপর আপনি যদি উভয় পেইন একই নথিতে সেট করেন, স্ট্যাটাস লাইন “কোনো পার্থক্য নেই — ইনপুটগুলো অভিন্ন”-এ পরিবর্তিত হয়।

প্রশ্নোত্তর#

পুনর্বিন্যস্ত একটি অ্যারে কেন সম্পূর্ণ পরিবর্তিত হিসেবে দেখায়?#

JSON অ্যারে ক্রমানুসার, এবং সমতা অবস্থানগত। [1, 2] এবং [2, 1] সূচক 0 এবং সূচক 1-এ ভিন্ন, তাই diff দুটি পরিবর্তন রিপোর্ট করে। যেখানে ক্রম অর্থপূর্ণ সেখানে এটি সঠিক। আপনার অ্যারে যদি একটি সেট উপস্থাপন করে, তবে তুলনার আগে উভয় নথিতে তা সাজান (বা নরমালাইজ করুন) — অন্যথায় স্থানান্তরগুলো সম্পাদনা হিসেবে দেখাবে।

এটি কি লক্ষ্য করে যখন একটি অবজেক্ট কী-এর নাম পরিবর্তন করা হয়?#

এটি একটি অপসারণ এবং একটি যোগ হিসেবে রিপোর্ট করে, কারণ JSON-এ “এই কী সেই কী হয়ে গেছে” প্রকাশ করার কোনো উপায় নেই। enabled-কে active-এ নাম পরিবর্তন করা removed $.enabled এবং added $.active হিসেবে দেখা যায় — দুটি সারি, একটি “নাম পরিবর্তন” নয়। ডেটাতে কী পরিবর্তিত হয়েছে তার এটিই সৎ উপস্থাপনা।

একটি প্রকার পরিবর্তন কেমন দেখায়?#

এটি একটি একক changed সারি হিসেবে রিপোর্ট করা হয়। যদি একটি মান স্ট্রিং "36" থেকে সংখ্যা 36-এ যায়, diff সেই পথে "36" → 36 দেখায় — ভিন্ন সিরিয়ালাইজেশনগুলো প্রকার ফ্লিপকে দৃশ্যমান করে। একই null থেকে false হওয়ার ক্ষেত্রেও প্রযোজ্য, বা একটি সংখ্যা অবজেক্ট হওয়ার ক্ষেত্রেও।

এটি কি আমাকে বলতে পারে কোন ফিল্ডগুলো অপরিবর্তিত?#

না, এবং ইচ্ছাকৃতভাবে। প্রতিটি অপরিবর্তিত ফিল্ড তালিকা করা যেকোনো বাস্তব নথিতে প্রকৃত পরিবর্তনগুলোকে শব্দশব্দে ডুবিয়ে দিত। diff শুধুমাত্র ডেল্টা দেখায়; সমান শাখাগুলো নীরব থাকে। আপনার যদি একটি নথির সম্পূর্ণ আকার প্রয়োজন, তবে ট্রি ভিউয়ার দিয়ে তা রেন্ডার করুন।