Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Membezakan Antara Medan JSON Nol dan Tidak Hadir dalam Go?

Bagaimana untuk Membezakan Antara Medan JSON Nol dan Tidak Hadir dalam Go?

Barbara Streisand
Lepaskan: 2024-12-05 08:57:09
asal
818 orang telah melayarinya

How to Differentiate Between Null and Absent JSON Fields in Go?

Membezakan Antara Medan JSON Ditetapkan kepada Null dan Medan Tidak Hadir

Apabila menyahmarshall JSON ke dalam struct Go, membezakan sama ada medan adalah batal atau tidak hadir boleh menjadi satu cabaran . Kedua-dua senario menghasilkan nilai sifar dalam struct, menjadikannya sukar untuk menentukan kehadiran asal medan.

Untuk menangani isu ini, mari kita terokai dua penyelesaian:

1. Menggunakan Generik (Go 1.18 )

Go 1.18 memperkenalkan generik, membolehkan kami mencipta struct generik yang menjejaki kehadiran nilai JSON:

type Optional[T any] struct {
    Defined bool
    Value   *T
}
Salin selepas log masuk

Struktur Pilihan ini menggunakan Defined medan untuk menunjukkan sama ada nilai itu wujud dalam muatan JSON. Apabila medan hadir, medan Nilai memegang nilai yang tidak dimarshaled. Dengan memasukkan struct ini ke dalam struct anda sendiri, anda boleh membezakan antara medan kosong dan tiada:

type Payload struct {
    Field1 Optional[string] `json:"field1"`
    Field2 Optional[bool]   `json:"field2"`
    Field3 Optional[int32]  `json:"field3"`
}
Salin selepas log masuk

2. Jenis Tersuai (Pra-Generik)

Sebelum generik, kita boleh mencipta jenis tersuai untuk mengendalikan nilai pilihan:

type OptionalString struct {
    Defined bool
    Value   *string
}
Salin selepas log masuk

Jenis ini termasuk medan Ditakrifkan untuk menunjukkan kehadiran dan Medan nilai untuk menahan rentetan yang tidak dimarshallkan. Dengan mentakrifkan jenis tersuai untuk setiap jenis yang anda perlu kendalikan (cth., OptionalInt untuk integer), anda boleh mengekalkan maklumat tentang kehadiran medan.

Contoh:

Pertimbangkan muatan JSON berikut:

{
  "somefield1":"somevalue1",
  "somefield2":null
}
Salin selepas log masuk
{
  "somefield1":"somevalue1",
}
Salin selepas log masuk

Menggunakan penyelesaian kami, kami boleh bezakan antara kes ini:

p1 := Payload{}
_ = json.Unmarshal([]byte(`{
            "somefield1": "somevalue1",
            "somefield2": null
        }`), &p1)

fmt.Printf("Should be defined == true and value == nil: \n%+v\n\n", p1)
Salin selepas log masuk

Output:

Should be defined == true and value == nil: 
{SomeField1:somevalue1 SomeField2:{Defined:true Value:<nil>}}
Salin selepas log masuk
p2 := Payload{}
_ = json.Unmarshal([]byte(`{
            "somefield1": "somevalue1",
        }`), &p2)

fmt.Printf("Should be defined == false: \n%+v\n\n", p2)
Salin selepas log masuk

Output:

Should be defined == false: 
{SomeField1:somevalue1 SomeField2:{Defined:false Value:<nil>}}
Salin selepas log masuk

Contoh ini menunjukkan bagaimana penyelesaian kami boleh membezakan antara null dan tiada medan JSON, memberikan maklumat berharga semasa penyahserikatan.

Atas ialah kandungan terperinci Bagaimana untuk Membezakan Antara Medan JSON Nol dan Tidak Hadir 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