गैर-समरूप 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