কীভাবে দ্রুত ম্যালফর্মড JSON ফাইল ঠিক করবেন: ডেভেলপারদের ফিল্ড ম্যানুয়াল
আপনার API কল এইমাত্র JSONDecodeError: Expecting property name enclosed in double quotes দিয়ে ব্যর্থ হয়েছে। ঘড়ির কাঁটা ঘুরে চলেছে। ডেটা এসেছিল LLM থেকে, আর সেই ২০০০ টোকেনের রেসপন্সের কোথাও একটি মাত্র ট্রেইলিং কমা আপনার পুরো পাইপলাইন বানচাল করে দিয়েছে।
২০২৬ সালের মে অনুযায়ী, ম্যালফর্মড JSON ফাইল ঠিক করার দ্রুততম উপায় হলো json_repair (Python) বা jsonrepair (npm)-এর মতো অটোমেটেড লাইব্রেরি ব্যবহার করা। এই টুলগুলো বিশেষভাবে LLM-উৎপন্ন সিনট্যাক্স ত্রুটি মুহূর্তের মধ্যে ঠিক করার জন্য তৈরি। ম্যানুয়াল মেরামতের ক্ষেত্রে সাধারণ সন্দেহভাজনরা হলো ট্রেইলিং কমা, সিঙ্গেল কোট বা আনকোটেড কী — RFC 8259 স্ট্যান্ডার্ডের তিনটি সবচেয়ে সাধারণ লঙ্ঘন।
দ্রুততম সমাধান: LLM আউটপুটের জন্য json_repair
Python-এর json.loads()-এর মতো স্ট্যান্ডার্ড পার্সারগুলো ডিজাইন অনুসারেই কঠোর। একটি ভুল স্থানের ক্যারেক্টার JSONDecodeError ট্রিগার করে এবং সবকিছু থেমে যায়। ২০২৬ সালে এটি দৈনন্দিন সমস্যা, কারণ LLM প্রায়ই JSON-কে কথোপকথনমূলক টেক্সটে মুড়িয়ে দেয়, রেসপন্স মাঝামাঝি কেটে দেয়, বা এমন কমেন্ট ছড়িয়ে দেয় যা স্পেক ভেঙে দেয়।
json_repair লাইব্রেরিটি হলো প্রথম পছন্দের সমাধান। GitHub-এর তথ্য অনুযায়ী, ২০২৬ সাল পর্যন্ত এই প্রজেক্টটির ৪৭০০-এর বেশি স্টার রয়েছে। এটি স্ট্রিংয়ের উদ্দেশ্য “অনুমান” করে কাজ করে — অনুপস্থিত ব্র্যাকেট বন্ধ করা, কোট যোগ করা এবং JSON ব্লকের চারপাশের অতিরিক্ত টেক্সট সরিয়ে ফেলা।

Python: আগে ও পরে
ইনস্টল: pip install json-repair
ভাঙা ইনপুট:
import json_repair
bad_json = '{"user": "Alice", "status": tru'
decoded_object = json_repair.loads(bad_json)
পর্দার পেছনে কী ঘটেছিল: json_repair বুঝতে পেরেছিল যে tru সম্ভবত true, অনুপস্থিত ক্লোজিং ব্রেস যোগ করেছে, এবং একটি বৈধ Python ডিকশনারি ফিরিয়ে দিয়েছে। বিন্দুমাত্র ম্যানুয়াল হস্তক্ষেপ ছাড়াই।
স্যালভেজ মোড: যখন ডেটা সত্যিই ভয়ানক
কঠিন ক্ষেত্রে, json_repair (v0.59.5+) একটি Salvage Mode অন্তর্ভুক্ত করে। প্রজেক্ট ডকুমেন্টেশনে উল্লেখ করা হয়েছে, এই মোডটি বিশেষভাবে ট্রাঙ্কেটেড AI রেসপন্স বা করাপ্ট লগের জন্য তৈরি। এটি অ্যারেকে জোর করে অবজেক্টে রূপান্তর করতে পারে বা এমন আইটেম বাদ দিতে পারে যা বাঁচানো অসম্ভব, যাতে আউটপুট আপনার স্কিমার সাথে মেলে।
import json_repair
# Salvage mode for severely truncated data
result = json_repair.loads(
'{"items": [{"id": 1, "name": "Widget"}, {"id": 2, "na',
salvage_mode=True
)
# Result: {'items': [{'id': 1, 'name': 'Widget'}, {'id': 2}]}
# Dropped the incomplete 'na' but saved everything else
npm বিকল্প
Node.js প্রজেক্টের জন্য, jsonrepair CLI একই কাজ সামলায়:
# Fix a file in place
npx jsonrepair broken.json > fixed.json
# Fix a string in a script
const { jsonrepair } = require('jsonrepair');
const fixed = jsonrepair('{"name": "test",}');
ম্যানুয়াল ডিবাগিং: কী স্পেক ভেঙেছে তা খুঁজে বের করা
যখন অটোমেশনে কাজ হয় না, আপনাকে ঠিক জায়গাটি খুঁজে বের করতে হবে যেখানে ফাইলটি RFC 8259 লঙ্ঘন করে। JSON YAML বা JavaScript-এর চেয়ে অনেক কম ক্ষমাশীল। JSONParser Diagnostics Team-এর ব্যাখ্যা অনুযায়ী, “পার্সার প্রথম ক্যারেক্টারেই ব্যর্থ হয় যা সে বুঝতে পারে না, যা প্রায়শই কয়েক লাইন আগের কোনো সমস্যার ডাউনস্ট্রিম লক্ষণ।”
তিন ধরনের JSON কিলার
কিলার ১: ট্রেইলিং কমা
DEV Community-এর মতে, ট্রেইলিং কমা পার্স ব্যর্থতার শীর্ষ কারণ। JavaScript-এ এগুলো ঠিক আছে, কিন্তু JSON অ্যারে বা অবজেক্টের শেষ আইটেমের পরে এগুলো অবৈধ।
// BROKEN - trailing comma after "active"
{
"name": "Alice",
"status": "active",
}
// FIXED - no comma before closing brace
{
"name": "Alice",
"status": "active"
}
কিলার ২: সিঙ্গেল কোট
JSON কী এবং স্ট্রিং ভ্যালু উভয়ের জন্যই ডাবল কোট (") দাবি করে। অনেক Python ও JavaScript ডেভেলপার ভুলবশত সিঙ্গেল কোট (') ব্যবহার করে ফেলেন। TidyCode-এর মতে, এটি অবশ্যই ঠিক করতে হবে।
// BROKEN - single quotes
{'name': 'Alice'}
// FIXED - double quotes
{"name": "Alice"}
কিলার ৩: আনকোটেড কী
JavaScript-এ আপনি { name: "Alice" } লিখতে পারেন। কিন্তু JSON-এ প্রতিটি কী-এর ডাবল কোট প্রয়োজন।
// BROKEN - unquoted key
{name: "Alice"}
// FIXED - quoted key
{"name": "Alice"}

“Unexpected Token” ত্রুটি
যখন কোনো ভ্যালিডেটর “Unexpected Token” চিহ্নিত করে, এর অর্থ পার্সার NaN, Infinity বা undefined-এ গিয়েছে — JavaScript কনস্ট্যান্ট যা JSON সমর্থন করে না। JSON শুধুমাত্র null, true, false এবং সংখ্যা অনুমোদন করে।
// BROKEN - NaN is not valid JSON
{"score": NaN, "result": Infinity}
// FIXED - replace with null or valid values
{"score": null, "result": null}
স্ট্রিক্ট পার্সিং বনাম রিপেয়ার পার্সিং: কখন কোনটি ব্যবহার করবেন
সঠিক পদ্ধতি নির্ভর করে আপনার ডেটা কোথা থেকে আসছে তার ওপর। মানুষের সম্পাদিত কনফিগ ফাইলের ক্ষেত্রে লেখককে ভুল ঠিক করতে বাধ্য করতে স্ট্রিক্ট পার্সিং প্রযোজ্য। LLM বা API লগ থেকে আসা মেশিন-উৎপাদিত ডেটার রিপেয়ার-ভিত্তিক পার্সিং প্রয়োজন।
| বৈশিষ্ট্য | স্ট্রিক্ট (json.loads) |
রিপেয়ার (json_repair) |
|---|---|---|
| ট্রেইলিং কমা | JSONDecodeError রেইজ করে |
স্বয়ংক্রিয়ভাবে সরানো হয় |
| সিঙ্গেল কোট | ব্যর্থ হয় | ডাবল কোটে রূপান্তরিত হয় |
| ট্রাঙ্কেটেড ডেটা | ব্যর্থ হয় | খোলা ব্র্যাকেট/কোট বন্ধ করে |
| কমেন্ট | ব্যর্থ হয় | স্বয়ংক্রিয়ভাবে সরানো হয় |
| সেরা ব্যবহার | মানুষের সম্পাদিত কনফিগ ফাইল | LLM আউটপুট, API লগ |
Pydantic দিয়ে স্কিমা-গাইডেড রিপেয়ার
আপনি Pydantic v2 বা JSON Schema ব্যবহার করে রিপেয়ার প্রক্রিয়া গাইড করতে পারেন। json_repair-কে একটি স্কিমা দিলে, টুলটি শুধু সিনট্যাক্সই ঠিক করে না — এটি টাইপ সংশোধন করতে পারে (স্ট্রিং "1"-কে সংখ্যা 1-এ রূপান্তর) এবং ডিফল্ট মান দিয়ে অনুপস্থিত আবশ্যক ফিল্ড পূরণ করতে পারে।
from pydantic import BaseModel
import json_repair
class User(BaseModel):
id: int
name: str
active: bool = True
# Broken JSON with wrong types
raw = '{"id": "42", "name": "Alice"}'
repaired = json_repair.loads(raw)
# Validate against schema
user = User(**repaired)
# user.id is now int(42), user.active defaults to True
Stefano Baccianella তাঁর ২০২৫ সালের প্রজেক্ট উদ্ধৃতিতে যেমন উল্লেখ করেছেন, এই পদ্ধতিটি ভাষার মডেলগুলোর উৎপাদিত “বেশিরভাগ ক্ষেত্রে সঠিক কিন্তু কারিগরিভাবে অবৈধ” JSON-এর জন্য অপ্টিমাইজ করা।
ক্র্যাশ না করে মাল্টি-গিগাবাইট ফাইল হ্যান্ডলিং
১০KB স্নিপেট ঠিক করা সহজ। ২GB ফাইল ঠিক করতে এমন কৌশল দরকার যা আপনার সব RAM খেয়ে ফেলবে না। পুরো ফাইল মেমরিতে লোড করলে Out-of-Memory (OOM) ত্রুটি হয়।
কৌশল ১: ijson দিয়ে স্ট্রিমিং
বিশাল ডেটাসেটের জন্য, ijson ব্যবহার করে টুকরো টুকরো করে ডেটা প্রসেস করুন। Scrapfly-এর উল্লেখ অনুযায়ী, ijson ইনক্রিমেন্টালি ডেটা প্রসেস করে। এটিকে একটি ক্লিনআপ স্ক্রিপ্টের সাথে যুগল করুন যা পার্স করার আগে লাইন-বাই-লাইন সমস্যা ঠিক করে।
import ijson
# Stream through a large JSON file
with open('huge_broken.json', 'r') as f:
for item in ijson.items(f, 'records.item'):
# Process each item individually
process(item)
কৌশল ২: সর্বোচ্চ দক্ষতার জন্য CLI পাইপ
বড় ফাইলের জন্য সবচেয়ে মেমরি-দক্ষ পদ্ধতি হলো jsonrepair CLI ব্যবহার করা এবং আউটপুট সরাসরি একটি নতুন ফাইলে পাইপ করা:
# Streams repair, never loads full file into memory
jsonrepair large_broken.json > fixed.json
এটি ফাইলকে Python বা ব্রাউজারে লোড করার চেয়ে উল্লেখযোগ্যভাবে বেশি মেমরি-দক্ষ।
উপসংহার
json_repair-এর মতো AI-সচেতন লাইব্রেরির জন্য ম্যালফর্মড JSON ঠিক করা আর ম্যানুয়াল কাজ নয়। আপনাকে এখনও RFC 8259-এর বেসিক বিষয়গুলো বুঝতে হবে — কোনো ট্রেইলিং কমা নয়, কোনো সিঙ্গেল কোট নয়, কোনো আনকোটেড কী নয় — কিন্তু ২০২৬ সালে বড় আকারের ডেটার জন্য অটোমেশনই একমাত্র বাস্তবসম্মত পদ্ধতি।
ওয়ার্কফ্লোটি সহজ: প্রথমে একটি রিপেয়ার লাইব্রেরি চেষ্টা করুন। তা ব্যর্থ হলে, সঠিক সিনট্যাক্স ত্রুটি চিহ্নিত করতে একটি ভ্যালিডেটর ব্যবহার করুন। এতে আসা ডেটা যতই অসম্পূর্ণ হোক না কেন, আপনার অ্যাপ্লিকেশনগুলো চালু থাকে।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
JSON কি আনুষ্ঠানিকভাবে কমেন্ট বা সিঙ্গেল কোট সমর্থন করে?
না। RFC 8259 স্ট্যান্ডার্ড কঠোরভাবে কমেন্ট নিষিদ্ধ করে। সিঙ্গেল কোটও অবৈধ — কী এবং স্ট্রিংয়ের জন্য শুধুমাত্র ডাবল কোট অনুমোদিত। তবে, json_repair-এর মতো টুল কমেন্ট সরাতে এবং কোট স্বয়ংক্রিয়ভাবে রূপান্তর করতে পারে, যাতে স্ট্যান্ডার্ড লাইব্রেরি ফাইলগুলো পার্স করতে পারে।
আমি কীভাবে খুব বড় ম্যালফর্মড JSON ফাইল ক্র্যাশ ছাড়া হ্যান্ডেল করব?
ijson-এর মতো স্ট্রিমিং পার্সার ব্যবহার করে চাঙ্কে চাঙ্কে ডেটা প্রসেস করুন। পুরো ম্যালফর্মড স্ট্রিং একটি মাত্র ভেরিয়েবলে লোড করা এড়িয়ে চলুন। দ্রুততম ফলাফলের জন্য, CLI রিপেয়ার টুল ব্যবহার করুন যা সব মেমরিতে না রেখে আউটপুট সরাসরি ডিস্কে একটি নতুন ফাইলে পাইপ করে।
ম্যালফর্মড JSON এবং অবৈধ JSON-এর মধ্যে পার্থক্য কী?
ম্যালফর্মড JSON সিনট্যাক্স নিয়ম ভঙ্গ করে — অনুপস্থিত ব্র্যাকেট, আনকোটেড কী, ট্রেইলিং কমা — যা পার্স করা অসম্ভব করে তোলে। অবৈধ JSON সব সিনট্যাক্স নিয়ম মানলেও নির্দিষ্ট কোনো JSON Schema-এর সাথে মেলে না (যেমন, স্কিমা যেখানে পূর্ণসংখ্যা চায়, সেখানে ফিল্ডটি স্ট্রিং)। ম্যালফর্মড JSON ঠিক করা হলো কাঠামোগত মেরামত; অবৈধ JSON ঠিক করা হলো ডেটা অখণ্ডতার বিষয়।
আমি কি json_repair কে Pydantic ভ্যালিডেশনের সাথে ব্যবহার করতে পারি?
হ্যাঁ। প্রথমে json_repair.loads() চালিয়ে সিনট্যাক্স ত্রুটি ঠিক করুন, তারপর রিপেয়ার করা ডিকশনারিটি টাইপ ভ্যালিডেশন ও স্কিমা প্রয়োগের জন্য আপনার Pydantic মডেলে পাস করুন। এই দ্বি-ধাপ পদ্ধতি কাঠামোগত এবং শব্দার্থগত — উভয় ধরনের সমস্যাই সমাধান করে।
JavaScript-স্টাইলের কমেন্টসহ JSON সম্পর্কে কী?
স্ট্যান্ডার্ড JSON কমেন্ট সমর্থন করে না, তবে json_repair স্বয়ংক্রিয়ভাবে // এবং /* */ কমেন্ট সরিয়ে দিতে পারে। আপনার কনফিগ ফাইলে কমেন্ট রাখা প্রয়োজন হলে, JSONC (কমেন্টসহ JSON) ফরম্যাট এবং Python-এর জন্য json5-এর মতো সামঞ্জস্যপূর্ণ পার্সার বিবেচনা করুন।