json.Unmarshal Golang tidak secara eksplisit menetapkan nilai penunjuk kepada sifar jika medan tidak wujud dalam JSON

WBOY
Lepaskan: 2024-02-09 08:12:08
ke hadapan
807 orang telah melayarinya

如果 JSON 中不存在该字段,Golang 的 json.Unmarshal 不会显式将指针值设置为 nil

Menurut pengenalan editor PHP Zimo, apabila json.Unmarshal dalam Golang menghuraikan data JSON, jika medan tidak wujud dalam JSON, ia tidak akan menetapkan nilai penunjuk kepada nil secara eksplisit. Ini bermakna walaupun medan tiada daripada JSON, penuding masih akan mengekalkan nilai asalnya, yang berpotensi menyebabkan ralat atau pengecualian dalam program anda. Oleh itu, apabila menggunakan json.Unmarshal, kita perlu memberi perhatian khusus untuk mengendalikan medan yang hilang untuk memastikan kestabilan dan ketepatan program.

Kandungan soalan

Pertimbangkan contoh ini:

<code>package main

import (
    "encoding/json"
    "fmt"
)

type InternalStructFirst struct {
    Field string `json:"field"`
}
type ExternalStruct struct {
    StructA InternalStructFirst `json:"struct_a"`
    StructB *InternalStructFirst `json:"struct_b"`
}

func main() {
    var structVar ExternalStruct
    string1 := "{\"struct_a\":{\"field\":\"a\"},\"struct_b\":{\"field\":\"b\"}}"

    json.Unmarshal([]byte(string1), &structVar)
    fmt.Printf("first: %+v %+v\n", structVar.StructA, structVar.StructB)

    string2 := "{\"struct_a\":{\"field\":\"c\"}}"
    json.Unmarshal([]byte(string2), &structVar)
    fmt.Printf("second: %+v %+v\n", structVar.StructA, structVar.StructB)

    var structVar2 ExternalStruct
    json.Unmarshal([]byte(string2), &structVar)
    fmt.Printf("third: %+v %+v\n", structVar2.StructA, structVar2
}


</code>
Salin selepas log masuk

Apakah output:

first: {Field:a} &{Field:b}
second: {Field:c} &{Field:b}
third: {Field:} <nil>
Salin selepas log masuk

Apabila saya melaksanakan json.Unmarshal buat kali pertama, StructB muncul dalam respons dan dibongkar dengan betul. Tetapi apabila saya melakukan ini untuk kali kedua, ia nampaknya tidak menetapkannya secara eksplisit kepada sifar apabila medan tidak ditunjukkan dalam respons. Apabila melakukan ini pada struct yang tidak mempunyai set medan ini, ia menetapkannya kepada nil (atau nampaknya tidak menetapkannya kepada sesuatu) (seperti yang ditunjukkan dalam contoh ketiga).

Jika saya telah menetapkan struct_b kepada non-nil, bagaimana saya boleh menukar contoh saya supaya apabila menghuraikan rentetan JSON yang tidak mengandungi medan struct_b, struct_b 设置为非 nil,如何更改我的示例,以便在解析其中不包含 struct_b 字段的 JSON 字符串时,第二个 json.Unmarshal 将显式将 StructB 设置为 nil ?

解决方法

你不能。 json.Unmarshal 不会修改输入 JSON 中未表示的结构字段。要么使用空结构开始,要么在调用 Unmarshal kedua akan Tetapkan StructB secara eksplisit kepada nil?

🎜Penyelesaian🎜🎜Anda tidak boleh. 🎜 Medan struktur yang tidak diwakili dalam input JSON tidak akan diubah suai. Sama ada mulakan dengan struktur kosong atau tetapkan mana-mana medan kepada apa-apa nilai yang anda mahukan sebelum memanggil Unmarshal jika ia tiada dalam input JSON. 🎜

Atas ialah kandungan terperinci json.Unmarshal Golang tidak secara eksplisit menetapkan nilai penunjuk kepada sifar jika medan tidak wujud dalam JSON. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!