JSON পার্থক্য
JSONদুটি JSON নথি তুলনা করে কাঠামোগত পার্থক্য তুলে ধরে।
এই পৃষ্ঠায়
JSON diff কী?#
একটি JSON diff দুটি JSON নথি তুলনা করে এবং আপনাকে সুনির্দিষ্টভাবে জানায় এদের মধ্যে কী পরিবর্তিত হয়েছে — কোন কোন ফিল্ড যুক্ত হয়েছে, কোনগুলো অদৃশ্য হয়েছে, এবং কোনগুলো একই পথ ধরে রেখেছে কিন্তু ভিন্ন মান নিয়েছে। এটি একটি টেক্সট diff-এর কাঠামোগত সমতুল্য, কিন্তু লাইন মেলানোর বদলে এটি অবজেক্ট ও অ্যারে ট্রি অতিক্রম করে, তাই 1 থেকে 2-এ চলে যাওয়া একটি মান টেক্সটের পুনর্লিখিত ব্লক হিসেবে নয়, একটি নির্দিষ্ট পথে একটি সুনির্দিষ্ট সম্পাদনা হিসেবে দেখা যায়।
এটি তখনই গুরুত্বপূর্ণ যখনই JSON এমন কিছুর ওয়্যার ফরম্যাট যা বিবর্তিত হয়: ডিপ্লয়ের মধ্যে API প্রতিক্রিয়া, সংশোধনের মধ্যে কনফিগ ফাইল, একটি টেস্ট স্যুটে ফিক্সচার, দিনের মধ্যে রপ্তানিকৃত ডেটা। পাশাপাশি দুটি প্রেটি-প্রিন্ট করা দলায় তাকিয়ে থাকা শুধুমাত্র ক্ষুদ্র নথির জন্যই কাজ করে; নেস্টিং গভীর হওয়ার সাথে সাথেই আপনাকে পার্থক্যগুলো গণনা করতে হয়।
ধারাবাহিকতার সমস্যা হলো JSON diff অ্যারের ক্রম-সংবেদনশীল। দুটি অ্যারে তখনই সমান যখন তাদের উপাদানগুলো অবস্থান অনুসারে মেলে, কারণ JSON নিজেই সমতা এভাবেই সংজ্ঞায়িত করে। তাই [a, b] এবং [b, a] ভিন্ন, এবং diff তা রিপোর্ট করবে — যখন ক্রম অর্থপূর্ণ তখন উপযোগী (ধাপের ক্রম), যখন নয় তখন অবাক করে (অ্যারে হিসেবে ছদ্মবেশী একটি সেট)।
ব্যবহারবিধি#
- মূল নথিটি বাম (মূল) পেইনে এবং সংশোধিত নথিটি ডান (পরিবর্তিত) পেইনে পেস্ট করুন।
- টাইপ করার সাথে সাথে তুলনা লাইভ চলে। জোর করে রিফ্রেশ করতে তুলনা ক্লিক করতে পারেন।
- আউটপুট এলিকাটি প্রতিটি পার্থক্য তার নিজস্ব সারিতে তালিকাভুক্ত করে:
- যোগ হয়েছে — পথ শুধু ডানদিকে আছে; সারিটি নতুন মান দেখায়।
- মুছে ফেলা হয়েছে — পথ শুধু বাঁদিকে আছে; সারিটি পুরোনো মান দেখায়।
- পরিবর্তিত — পথ উভয় পাশে আছে কিন্তু ভিন্ন মান সহ; সারিটি
পুরোনো → নতুনদেখায়। প্রতিটি সারির পূর্বে$.versionবা$.tags[2]-এর মতো একটি JSONPath-স্টাইল পথ থাকে, যাতে আপনি যেকোনো একটি নথিতে এটি খুঁজে পান।
- যদি উভয় নথি গভীরভাবে সমান হয়, স্ট্যাটাস লাইনটি তা স্পষ্টভাবে বলে — “কোনো পার্থক্য নেই” — একটি খালি পেইন ব্যাখ্যা করার জন্য ফেলে না দিয়ে।
- নমুনা একটি বাস্তবসম্মত আগে/পরের জোড় লোড করে; মুছুন উভয় পেইন ও ফলাফল রিসেট করে।
মূল বৈশিষ্ট্য#
- কাঠামোগত, টেক্সচুয়াল নয়। পার্স করা মান ট্রি তুলনা করে, তাই পুনরায় ইনডেন্ট, অবজেক্ট কী পুনর্বিন্যাস, বা হোয়াইটস্পেস পরিবর্তন কখনো মিথ্যা পার্থক্য তৈরি করে না।
- সুনির্দিষ্ট পথ। প্রতিটি পরিবর্তন 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 শুধুমাত্র ডেল্টা দেখায়; সমান শাখাগুলো নীরব থাকে। আপনার যদি একটি নথির সম্পূর্ণ আকার প্রয়োজন, তবে ট্রি ভিউয়ার দিয়ে তা রেন্ডার করুন।