"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > \"कोड\" फ़ील्ड के साथ गैर-समरूप JSON डेटा को अनमर्शल कैसे करें?

\"कोड\" फ़ील्ड के साथ गैर-समरूप JSON डेटा को अनमर्शल कैसे करें?

2024-11-02 को प्रकाशित
ब्राउज़ करें:376

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