ما الذي حدث
مع إصدار Go 1.27، بلغت حزمة encoding/json/v2 وحزمتها المرافقة encoding/json/jsontext مرحلة الاستقرار وأصبحت متاحة للاستخدام العام، وفق ما أعلنته Go. وقد كتب منشور 4 نوفمبر 2026 سبعة مؤلفين، من بينهم Joe Tsai وDamien Neil وDaniel Martí وMichael Pratt. ويأتي المنشور بعد نسخة تجريبية من واجهة البرمجة قُدّمت في العام السابق، وجرى تحسينها بعد مزيد من الملاحظات.
وقال المؤلفون إن حزمة encoding/json الأصلية أثبتت مرونتها، لكنها تحمل عيوبًا أشار إليها المستخدمون على مر السنين. فهي تتسامح مع UTF-8 غير الصالح، وهو ما يحظره RFC 8259. كما تقبل كائنات تتكرر فيها أسماء الأعضاء، وهي نقطة ضعف استغلها المهاجمون في السابق، كما في CVE-2017-12635 على سبيل المثال. إضافة إلى ذلك، تطابق أسماء الحقول دون اعتبار لحالة الأحرف، وتشفّر الشرائح والخرائط الفارغة (nil) على أنها null.
وبحسب المنشور، لم يكن بالإمكان تصحيح هذه السلوكيات دون الإخلال بوعد التوافق في Go 1. وينطبق الأمر نفسه على قيود الأداء، مثل تخزين القيم كاملة مؤقتًا في الذاكرة، والتباطؤ التربيعي عندما تستدعي الدوال المخصصة Marshal أو Unmarshal بصورة تكرارية. ويقسّم التصميم الجديد العمل إلى قسمين: تتولى jsontext معالجة صياغة JSON دون الاعتماد على الانعكاس (reflection)، بينما تربط json/v2 قيم JSON بأنواع Go.
السياق
تتضمن المكتبة القياسية في Go دعم JSON منذ ما قبل Go 1.0، ويصف المؤلفون JSON بأنه صيغة البيانات الأكثر استخدامًا على الإنترنت. ولأن المشكلات ناتجة عن واجهة البرمجة الحالية نفسها، اختاروا فضاء أسماء v2 منفصلًا بدلًا من إضافة دوال موازية مثل MarshalV2 داخل الحزمة الأصلية. وأظهر استطلاع أُشير إليه في المنشور أن معظم مستخدمي Go يريدون تشفير الشرائح والخرائط الفارغة (nil) على هيئة مصفوفات أو كائنات فارغة.
الموجز
أسبوع التقنية في رسالة واحدة.
التقارير التي تستحق وقتك، كل أسبوع. يمكنك إلغاء الاشتراك في أي وقت.
