Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menyelesaikan ralat "tidak boleh unmarshal..." dalam golang?

Bagaimana untuk menyelesaikan ralat "tidak boleh unmarshal..." dalam golang?

WBOY
WBOYasal
2023-06-24 20:01:594223semak imbas

Semasa proses pembangunan Golang, kami sering menggunakan JSON untuk pertukaran data dan siri. Walau bagaimanapun, apabila kami cuba menyahsiri data JSON ke dalam struktur, kadangkala kami menghadapi ralat "tidak boleh unmarshal...". Mesej ralat ini samar, sukar difahami dan mengelirukan. Artikel ini akan membantu anda memahami punca ralat ini dan menyediakan beberapa penyelesaian.

Penyelesaian 1: Semak jenis pembolehubah ahli struktur

Ralat "tidak boleh unmarshal..." biasanya disebabkan oleh ketidakpadanan antara nilai dalam rentetan JSON dan jenis pembolehubah ahli struktur. Untuk mengelakkan ralat ini, kita harus memastikan bahawa apabila mengisytiharkan struktur, jenis setiap pembolehubah ahli sepadan dengan nilai yang sepadan dalam JSON.

Sebagai contoh, kami mentakrifkan struktur berikut:

type Person struct {
    Name string
    Age  int
}

Jika kami cuba menyahsiri JSON berikut menjadi struktur, kami akan menghadapi ralat "tidak boleh unmarshal...":

{
    "Name": "Lucy",
    "Age": "28"
}

Ini kerana jenis nilai Umur dalam JSON Ia adalah rentetan dan tidak boleh sepadan dengan jenis pembolehubah ahli Umur int dalam struktur. Kita perlu menentukan jenis Umur sebagai rentetan untuk menyahsiri data JSON dengan betul.

Penyelesaian 2: Semak teg pembolehubah ahli struktur

Biasanya, jika kami mentakrifkan teg untuk medan dalam pembolehubah ahli struktur, maka maklumat teg akan membimbing data JSON semasa penyahserikatan , digunakan untuk mengenal pasti nama dan lain-lain butiran setiap bidang. Oleh itu, apabila menyahsiri JSON, jika maklumat teg tidak sepadan dengan nama atribut dalam data JSON, ralat ini juga mungkin berlaku.

Sebagai contoh, kami mentakrifkan struktur berikut:

type Person struct {
    Name string `json:"PersonName"`
    Age  int    `json:"PersonAge"`
}

Jika kami cuba menyahsiri JSON berikut menjadi struktur, kami juga akan menghadapi ralat "tidak boleh unmarshal...":

{
    "Name": "Lucy",
    "Age": 28
}

Ini kerana kami memberikannya struktur Dua medan Nama dan Umur mentakrifkan label, tetapi nama medan yang ditakrifkan dalam label tidak konsisten dengan nama atribut dalam data JSON. Oleh itu, kita perlu menukar nama atribut dalam data JSON kepada nama teg yang ditakrifkan dalam struktur untuk menyahsirikannya dengan betul.

Penyelesaian 3: Gunakan pakej json golang sendiri untuk anotasi

Kaedah lain ialah menggunakan pakej json golang sendiri untuk mengelakkan ralat "tidak boleh unmarshal..." melalui anotasi. Kaedah ini memerlukan kami menambah tag json pada setiap medan apabila mentakrifkan struktur, seperti yang ditunjukkan di bawah:

type Person struct {
    Name string `json:"name"`
    Age int `json:"age"`
}

Apabila menyahsiri JSON, kami perlu menggunakan kaedah json.Unmarshal dalam kod dan mengambil data JSON sebagai input . Dengan cara ini, data JSON boleh dinyahsiri dengan betul, contohnya:

p := &Person{}
jsonData := []byte(`{"name":"John","age":18}`)
err := json.Unmarshal(jsonData, p)
if err != nil {
    fmt.Println("Unmarshal error: ", err)
}
fmt.Printf("Name: %s, Age: %d", p.Name, p.Age)

Ringkasan

Dalam kebanyakan kes, ralat "tidak boleh unmarshal..." biasanya disebabkan oleh ketidakpadanan antara jenis dalam data JSON dan jenis pembolehubah ahli struktur atau Ini disebabkan oleh ketidakpadanan antara maklumat teg dan nama atribut dalam data JSON. Dengan menyemak isu ini dengan teliti, kami boleh mengelakkan ralat ini. Jika anda ingin menyelesaikan ralat ini dengan lebih baik, sila gunakan pakej json Golang sendiri untuk pengurusan anotasi.

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan ralat "tidak boleh unmarshal..." dalam golang?. 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