كشف بيانات 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