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

كيفية إلغاء تنظيم بيانات JSON غير المتجانسة باستخدام حقل \"الكود\"؟

تم النشر بتاريخ 2024-11-02
تصفح:945

How to Unmarshal Non-Homogenous JSON Data with a \

كشف بيانات JSON غير المتجانسة

يتمحور هذا الاستفسار حول إلغاء تنظيم بيانات JSON بكفاءة من خلال الاستفادة من آلية تسمح بالتفكيك الانتقائي لأقسام محددة أو شرائح. الهدف هو التعامل مع هياكل JSON حيث يعمل الجزء الأول بمثابة "رمز" يحدد نوع البيانات الموجودة في الجزء الأخير.

تخيل سيناريو حيث يكون لديك هياكل بيانات متعددة:

type Range struct {
    Start int
    End   int
}

type User struct {
    ID    int
    Pass  int
}

وتحتوي رسالة JSON على حقل "رمز" يشير إلى البيانات الموجودة في حقل "الحمولة":

{
    "Code": 4,
    "Payload": {
        "Start": 1,
        "End": 10
    }
}
{
    "Code": 3,
    "Payload": {
        "ID": 1,
        "Pass": 1234
    }
}

تحتاج إلى إلغاء تنظيم حقل "الحمولة" في بنية البيانات المناسبة استنادًا إلى حقل "الكود".

الحل

المفتاح هنا يمكنك استخدام نوع json.RawMessage لتأخير إلغاء تنظيم حقل "الحمولة" حتى بعد معرفة نوعه. على سبيل المثال:

package main

import (
    "encoding/json"
    "fmt"
)

type Message struct {
    Code    int
    Payload json.RawMessage // Delay parsing until we know the code
}

// Unmarshall into appropriate structures based on Code
func unmarshal(m []byte) error {
    var message Message
    err := json.Unmarshal(m, &message)
    if err != nil {
        return err
    }
    switch message.Code {
    case 3:
        var user User
        if err := json.Unmarshal(message.Payload, &user); err != nil {
            return err
        }
        fmt.Printf("Unmarshalled a User: %#v\n", user)
    case 4:
        var range Range
        if err := json.Unmarshal(message.Payload, &range); err != nil {
            return err
        }
        fmt.Printf("Unmarshalled a Range: %#v\n", range)
    default:
        return fmt.Errorf("unknown code: %d", message.Code)
    }
    return nil
}

func main() {
    json1 := []byte(`{"Code": 3, "Payload": {"ID": 1, "Pass": 1234}}`)
    if err := unmarshal(json1); err != nil {
        fmt.Printf("error: %v\n", err)
    }

    json2 := []byte(`{"Code": 4, "Payload": {"Start": 1, "End": 10}}`)
    if err := unmarshal(json2); err != nil {
        fmt.Printf("error: %v\n", err)
    }
}
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3