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
Lepaskan: 2024-12-30 03:50:09
asal
128 orang telah melayarinya

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"`
}
Salin selepas log masuk

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

{"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}
Salin selepas log masuk
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)
}
Salin selepas log masuk

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]]}
Salin selepas log masuk

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"`
}  
Salin selepas log masuk

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")
    }
}
Salin selepas log masuk

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan