Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Menghapuskan Data JSON Secara Dinamik kepada Jenis Generik dalam Go?

Bagaimanakah Saya Boleh Menghapuskan Data JSON Secara Dinamik kepada Jenis Generik dalam Go?

Linda Hamilton
Lepaskan: 2024-12-17 20:09:11
asal
134 orang telah melayarinya

How Can I Dynamically Unmarshal JSON Data into Generic Types in Go?

Menggunakan Jenis Generik dalam JSON Unmarshaling dengan Go

In Go, apabila menghadapi cabaran unmarshaling data JSON ke dalam antara muka{}, adalah penting untuk memahami cara untuk secara dinamik mengendalikan jenis data yang berbeza berdasarkan kekunci tertentu. Artikel ini menangani isu ini, menyediakan penyelesaian untuk unmarshal JSON ke dalam antara muka generik{} dalam Go.

Masalahnya

Pertimbangkan senario di mana kita mempunyai jenis yang dipanggil Message dengan struct yang merangkumi medan Cmd (rentetan) dan medan Data (antara muka{}). Kami juga mempunyai CreateMessage jenis bersarang yang mentakrifkan struktur data tertentu. Apabila menyahmarshaling data JSON seperti '{"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}}', kita temui isu di mana medan Data tidak ditukar dengan betul kepada jenis CreateMessage yang sesuai.

Penyelesaian

Untuk menangani masalah ini, gunakan yang berikut pendekatan:

  • Tentukan jenis Mesej dengan medan Data jenis json.RawMessage untuk menangkap bahagian varian mesej.
  • Buat jenis struct untuk setiap struktur data yang berbeza, seperti CreateMessage dan unmarshal Data ke dalamnya berdasarkan nilai Cmd.

Berikut ialah contoh kod coretan yang menunjukkan penyelesaian:

type Message struct {
  Cmd string `json:"cmd"`
  Data      json.RawMessage
}  

type CreateMessage struct {
    Conf map[string]int `json:"conf"`
    Info map[string]int `json:"info"`
}  

func main() {
    var m Message
    if err := json.Unmarshal(data, &m); err != nil {
        log.Fatal(err)
    }
    switch m.Cmd {
    case "create":
        var cm CreateMessage
        if err := json.Unmarshal([]byte(m.Data), &cm); err != nil {
            log.Fatal(err)
        }
        fmt.Println(m.Cmd, cm.Conf, cm.Info)
    default:
        log.Fatal("bad command")
    }
}
Salin selepas log masuk

Dengan memanfaatkan pendekatan ini, data JSON boleh dibongkar secara dinamik ke dalam struktur data yang sesuai, membolehkan pengendalian fleksibel data JSON varian dalam Go.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghapuskan Data JSON Secara Dinamik kepada Jenis Generik dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan