۱۳ آبان ۱۴۰۵ go.dev ۳ دقیقه مطالعه

نسخه جدید API پردازش JSON در زبان Go؛ خداحافظی با محدودیت‌های نسخه قدیمی

نسخه جدید API پردازش JSON در زبان Go؛ خداحافظی با محدودیت‌های نسخه قدیمی — A New Go API for JSON

خلاصه

تیم زبان برنامه‌نویسی Go از ارائه نسخه‌های پایدار encoding/json/v2 و encoding/json/jsontext در Go 1.27 خبر داد. این نسخه‌های جدید برای رفع مشکلات ساختاری، رفتاری و عملکردی نسخه قدیمی طراحی شده‌اند و تجربه‌ای امن‌تر و بهینه‌تر را برای توسعه‌دهندگان به ارمغان می‌آورند.

زبان برنامه‌نویسی Go از سال‌ها پیش و بسیار قبل از انتشار نسخه ۱.۰، از فرمت محبوب JSON در کتابخانه استاندارد خود پشتیبانی کرده است. پکیج encoding/json در طول این سال‌ها عملکرد قابل قبولی داشته، اما با توجه به نیازهای مدرن توسعه‌دهندگان، محدودیت‌های ساختاری و رفتاری آن آشکار شده است. تیم Go پس از ماه‌ها بررسی و بازخورد، پکیج‌های جدید encoding/json/v2 و encoding/json/jsontext را به عنوان بخشی پایدار در Go 1.27 معرفی کرد.

مشکلات نسخه قدیمی (encoding/json) و لزوم تغییرات

اگرچه نسخه اول کارآمد بود، اما تصمیمات طراحی اولیه آن چالش‌هایی را ایجاد کرده بود که به دلیل تعهد Go به پایداری نسخه ۱ (Go 1 Compatibility Promise) قابل اصلاح نبودند. برخی از مهم‌ترین این مشکلات عبارتند از:

  • رفتارهای ناقص در برابر استاندارد: نسخه اول اعتبارسنجی سخت‌گیرانه‌ای روی ساختار JSON نداشت؛ برای مثال، ورودی‌های حاوی کاراکترهای نامعتبر UTF-8 یا نام‌های تکرار شونده در آبجکت‌ها را می‌پذیرفت که می‌توانست به مشکلات امنیتی (مانند آسیب‌پذیری‌های مشهور) منجر شود.
  • نشت وضعیت تهی (nilness): اسلایس‌ها و مپ‌های nil به صورت null در JSON سریالایز می‌شدند که برای بسیاری از سیستم‌های دیگر دردسرساز بود.
  • Unmarshaling حساس به کوچک و بزرگ بودن حروف: تطبیق فیلدهای JSON با ساختارهای Go به صورت case-insensitive انجام می‌شد که هم غیرمنتظره بود و هم از نظر امنیتی و عملکردی ایراد داشت.
  • محدودیت‌های API و عملکردی: عدم امکان ارسال تنظیمات به توابع سراسری Marshal و Unmarshal، تخصیص حافظه اضافی، و پردازش‌های مکرر در متون پیچیده از دیگر مشکلات این نسخه بود.

معماری جدید: تفکیک نحو (jsontext) از معنا (v2)

تیم Go برای حل اساسی این مشکلات، فرآیند کار با JSON را به دو بخش مجزا تقسیم کرده است:

  1. لایه نحوی (encoding/json/jsontext): وظیفه پردازش قواعد گرامری JSON را بر عهده دارد و کاملاً مستقل عمل می‌کند.
  2. لایه معنای داده‌ها (encoding/json/v2): ارتباط بین مقادیر JSON و ساختارها و تایپ‌های زبان Go را مدیریت می‌کند.

این جداسازی باعث می‌شود توسعه‌دهندگان کنترل بسیار دقیق‌تر و عملکرد بهینه‌تری روی جریان‌های داده داشته باشند و بتوانند گزینه‌های مختلف را بدون دردسرهای قبلی اعمال کنند.

نگاه جامعه توسعه‌دهندگان در هکرنیوز

در بحث‌های شکل‌گرفته پیرامون این انتشار در هکرنیوز، توسعه‌دهندگان از رفع مشکلات قدیمی استقبال کردند. با این حال، برخی کاربران به تغییرات جزئی در نحو استفاده از توابع پرکاربرد (مانند توابع قالب‌بندی و دندانه‌گذاری) اشاره کردند و معتقد بودند مهاجرت کدهای قدیمی به نسخه جدید ممکن است نیازمند refactorهای پیچیده‌ای باشد، هرچند وجود ابزارهای کمکی و مدل‌های زبانی تا حد زیادی این مسیر را هموار می‌کند.

این مطلب به‌صورت کاملاً خودکار و با هوش مصنوعی از مقالهٔ اصلی و بحث هکرنیوز تهیه شده و ممکن است خطا داشته باشد. حقوق مطلب اصلی متعلق به نویسندهٔ آن است. قوانین و گزارش مشکل

این خبر را با دیگران به اشتراک بگذارید

خبرهای فناوری در قالب پست و ویدیوی کوتاه، در اینستاگرام هکرنیوز بلاگ. به‌زودی
هر خبر به محض انتشار، به‌همراه پادکست روزانه در کانال تلگرام هکرنیوز بلاگ.