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
Barbara Streisandasal
2024-12-05 08:57:09819semak imbas

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
}

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

2. Jenis Tersuai (Pra-Generik)

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

type OptionalString struct {
    Defined bool
    Value   *string
}

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
}
{
  "somefield1":"somevalue1",
}

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)

Output:

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

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

Output:

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

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!

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