Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menyahmarshal JSON ke Antara Muka{} dengan Berkesan dalam Go?

Bagaimana untuk Menyahmarshal JSON ke Antara Muka{} dengan Berkesan dalam Go?

DDD
DDDasal
2024-12-30 03:50:09135semak imbas

How to Effectively Unmarshal JSON into an Interface{} in Go?

Menyahmarshall JSON ke Antara Muka{} dalam Go: Panduan Terperinci

Memahami cara menyahmarshal JSON ke dalam antara muka{} ialah kemahiran penting untuk pembangun Go. Dalam artikel ini, kita akan menelusuri contoh praktikal yang menyerlahkan perangkap dan penyelesaian yang dikaitkan dengan membongkar JSON ke dalam struct dengan medan{} antara muka.

Pertimbangkan definisi jenis berikut:

type Message struct {
    Cmd string `json:"cmd"`
    Data interface{} `json:"data"`
}

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

Memandangkan rentetan JSON yang mewakili mesej cipta, kami mungkin cuba menyahkodnya menjadi Mesej struct:

{"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}
import "encoding/json"

var data = []byte(`{"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}`)

var m Message
if err := json.Unmarshal(data, &m); err != nil {
    log.Fatal(err)
}

Setelah meneliti struct Message unmarshaled, kami mendapati bahawa medan Data kekal sebagai peta[rentetan]antara muka{}:

{Cmd:create Data:map[conf:map[a:1] info:map[b:2]]}

Mengatasi Antara Muka {} Perangkap

Untuk mengatasi had ini, kami menggunakan serampang dua mata pendekatan:

  1. Tentukan jenis struct untuk bahagian tetap mesej. Ini termasuk medan cmd dan medan json.RawMessage untuk menangkap bahagian varian mesej.
  2. Tentukan jenis struct untuk setiap jenis varian. Dalam kes kami, kami mentakrifkan CreateMessage struct.
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"`
}  

Dengan pengubahsuaian ini, kita boleh menyahkod data varian ke dalam jenis struct yang sesuai berdasarkan arahan:

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")
    }
}

Dengan menggunakan teknik ini, kita boleh berjaya menyahmarshal data JSON ke dalam struct Message, di mana medan Data mengandungi jenis CreateMessage varian. Rujuk contoh taman permainan yang disediakan untuk pelaksanaan lengkap.

Atas ialah kandungan terperinci Bagaimana untuk Menyahmarshal JSON ke Antara Muka{} dengan Berkesan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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