Ruby / التكامل: البيانات والموارد وأدلة التنفيذ والثقة / الدرس 13
تحويل JSON المفكوك إلى سجل أرشيف متحقق
افصل فك الصياغة والبنية النصية المفاتيح وحدود المجال واختيار الحقول والرفض الآمن.
في هذه الصفحة
أهداف الدرس
- اشرح لماذا لا يثبت JSON الصحيح وكائنات Ruby المرنة أمرا موثوقا.
- تحقق من الأنواع والنطاقات المطلوبة قبل بناء التمثيل الداخلي.
التحليل هو الحد الأول فقط
تنتج JSON.parse خرائط ومصفوفات ونصوصا وأعدادا و true و false و nil عادية. قد يصح النص ويخطئ الشكل العلوي أو الحقول. تكون المفاتيح String عادة ما لم تغير الخيارات السياسة. اربط الفك بالمتحقق ولا تنشر وصولا مرنا للمجال. استخدم JSON دون إضافات إنشاء كائنات لغير الموثوق، ولا تستبدل فك البيانات باستعادة كائنات عامة. تتبع إتاحة المكتبة ونسختها بيئة التنفيذ والاعتماديات الفعلية.
افحص العقد المطلوب كله قبل الوثوق بالنتيجة
يقبل المتحقق Hash بمعرف String غير فارغ وعدد Integer من 1 إلى 50 كسياسة أرشيف افتراضية لا عتبة ضبط أو أمان عامة. يعيد خريطة داخلية مجمدة بمفاتيح رمزية مختارة، ولا يضمن تجميد الغلاف ثبات كل قيمة بعمق. المعرف المطبّع String جديدة من strip وتبقى خاضعة للملكية. وتحتاج العملية الحقيقية الهوية والتفويض والحالة المرجعية والتزامن وراء قواعد الحقول المحلية.
require 'json'
def validate_record(value)
return nil unless value.is_a?(Hash)
id = value['id']
copies = value['copies']
return nil unless id.is_a?(String) && copies.is_a?(Integer)
normalized = id.strip
return nil if normalized.empty? || copies < 1 || copies > 50
{id: normalized, copies: copies}.freeze
end
value = JSON.parse('{"id":" A-4 ","copies":2}', create_additions: false)
record = validate_record(value)
puts(record ? "#{record.fetch(:id)}:#{record.fetch(:copies)}" : 'invalid')
puts validate_record({'id' => 'A-5', 'copies' => '2'}).nil?
A-4:2
true
المخرج المتوقع A-4:2 ثم true. يُرفض العدد النصي ولا يحول بصمت. يحتاج البرنامج مكتبة JSON ولم يُنفذ هنا.
أظهر سياسة التحويل والحقول المجهولة
لا تحول كل معرف لنص أو كل عدد بـ to_i لإنجاح التحقق؛ فقد يخفي عيب المرسل وسبب الرفض. حدّد تجاهل الزائد أو رفضه أو حفظه بامتداد محدود، ومعنى الغياب و null. قد تحتاج المفاتيح المكررة سياسة محلل قبل اختزالها لخريطة. احفظ نتائج كل سجل عند القبول الجزئي. أعلن التطبيع؛ فقد يصح تشذيب نص بشري ويخطئ لمعرف موقع أو حساس للحالة.
رمّز التمثيل العام فقط
تعالج JSON.generate الهروب والقيم المدعومة دون وصل يدوي. ابن خريطة عامة مختارة ولا تسلسل الداخل كله. يحذف المثال ملاحظة محلية ويستخدم مفاتيح String لمخطط خارجي صريح. هذا اختيار بيانات لا إثبات خصوصية أو تفويض كامل. طابق الدقة مع المستهلك خاصة عند عبور أعداد Ruby الكبيرة إلى JavaScript أو عرض ثابت. قد يحمل JSON صحيح معنى خاطئا؛ فراجع الأسماء والوحدات والنطاق وتطور النسخة كعقد واجهة.
require 'json'
internal = {id: 'A-4', copies: 2, note: 'local-only'}
public_value = {'id' => internal.fetch(:id), 'copies' => internal.fetch(:copies)}
puts JSON.generate(public_value)
{"id":"A-4","copies":2}
المخرج المتوقع {"id":"A-4","copies":2}. تغيب note عمدا. لا يصل المثال لسجل أو خدمة خارجية ولم يُنفذ اختبار ترميز Ruby.
حد المدخل واحفظ تشخيصا آمنا
لا يفرض المحلل تلقائيا حدود بايت أو تعشيق أو طول قوائم أو معالجة المنتج. طبق المناسب عند الاستقبال واستخدم خيارات معلنة ولا تسجل الوثيقة المرفوضة كاملة. التقط JSON::ParserError عند الفك ولا تبتلع فشل التطبيق الآخر. افحص الشكل والغياب و nil والمصفوفة المختلطة والحد والتطبيع معزولا. يمكن فحص JSON المضمن كبيانات هنا، لكن لم يُنفذ محلل Ruby أو تحميل gem أو تفويض أو تكامل.
الأخطاء الشائعة وإصلاحها
تُقبل وثيقة JSON صحيحة بأنواع حقول خاطئة.
- لماذا يحدث؟
- اختلط الفك بالتحقق البنيوي والدلالي.
- كيف تصلحه؟
- تحقق من الشكل والأنواع المطلوبة والنطاقات صراحة.
- كيف تتجنب تكراره؟
- أبق المحلل غير موثوق حتى بناء النموذج المتحقق.
يفوت بحث رمزي حقلا مفكوكا من JSON.
- لماذا يحدث؟
- دُمج مخططا المفاتيح الداخلي والخارجي.
- كيف تصلحه؟
- ترجم الحقول المعروفة مرة عبر حد متحقق.
- كيف تتجنب تكراره؟
- استخدم أمثلة بتمثيل مفاتيح المحلل الفعلي.
يتسرب حقل داخلي للمخرج المسلسل.
- لماذا يحدث؟
- رُمزت الحالة المتاحة كلها بدلا من عقد عام مختار.
- كيف تصلحه؟
- ابن تمثيلا صريحا بالحقول المعلنة فقط.
- كيف تتجنب تكراره؟
- راجع المخرج والسجلات والتفويض معا.
اختبر فهمك
1. لماذا لا تُستدعى to_i على نص JSON "2x" وتُقبل النتيجة؟
اعرض الحل المشروح
قد تحول المشوه لكمية معقولة وتخفي خطأ النوع أو الصيغة. اسمح بالتحويل فقط بعقد دقيق يحدد الصيغ والفشل؛ وإلا فارفض النوع وافحص المجال منفصلا. لا يثبت تحويل مريح أن المدخل يعني افتراض التطبيق.
2. هل تفوض خريطة متحققة مجمدة تعديلا حقيقيا للأرشيف؟
اعرض الحل المشروح
لا. تسجل فحوص الحقول ومنع تعديل الغلاف فقط. تبقى الهوية والملكية والحالة والفعل وقواعد التحديث المتزامن منفصلة. وجّه الأمر الحقيقي لمالكه المرجعي وتحقق من الضمانات مستقلا. لا تجعل كائن نقل البيانات قرار تفويض عرضيا.
أهم ما تعلمته
- الفك والتحقق والتفويض والتنفيذ مسؤوليات منفصلة.
- تحفظ سياسات المفاتيح والتحويل والمخرج الصريحة معنى JSON.