"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > الفواصل الزائدة في JSON: لماذا تتعارض بناء الجملة الحرفي المركب مع تحليل JSON؟

الفواصل الزائدة في JSON: لماذا تتعارض بناء الجملة الحرفي المركب مع تحليل JSON؟

نشر في 2025-03-23
تصفح:960

  Trailing Commas in JSON: Why Does Go\'s Composite Literal Syntax Conflict with JSON Parsing?

خطأ في بناء جملة الفاصلة في JSON مع GO

Dave Cheney ، وهو خبير مشهور أثناء التنقل ، يؤكد على متطلبات الفواصل الفاصلة في التصريحات الحرفية المركبة. ومع ذلك ، يبدو أن هذه القاعدة تتعارض مع تحليل JSON.

النظر في الكود التالي:

اكتب jsonobject struct { Objects [] ObjectType `json:" Objects "` } اكتب ObjectType struct { اسم سلسلة `json:" الاسم "` } Func Main () { Bytes: = [] Byte (`{" Objects ": [ {"name": "foo"} ، // قم بإزالة الفاصلة لجعل الكود يعمل! ]} `) jsontype: = & jsonobject {} json.unmarshal (bytes ، & jsontype) fmt.printf ("النتائج: ٪ v \ n" ، jsontype.objects [0] }
// package, imports omitted for brevity

type jsonobject struct {
    Objects []ObjectType `json:"objects"`
}

type ObjectType struct {
    Name string `json:"name"`
}

func main() {
    bytes := []byte(`{ "objects": 
        [ 
            {"name": "foo"}, // REMOVE THE COMMA TO MAKE THE CODE WORK!
        ]}`)
    jsontype := &jsonobject{}
    json.Unmarshal(bytes, &jsontype)
    fmt.Printf("Results: %v\n", jsontype.Objects[0].Name) // panic: runtime error: index out of range
}

الحل

لسوء الحظ ، لا يوجد حل. مواصفات JSON لا تسمح بفواصل زائدة. على الرغم من أن GO Syntax يفرض على الفواصل الزائدة في الحرفية المركبة ، فإن هذا المطلب لا ينطبق على تحليل JSON. [ {"الاسم": "فو"} ، ]]

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3