Heim  >  Artikel  >  Backend-Entwicklung  >  Golangs json.Unmarshal setzt einen Zeigerwert nicht explizit auf Null, wenn das Feld im JSON nicht vorhanden ist

Golangs json.Unmarshal setzt einen Zeigerwert nicht explizit auf Null, wenn das Feld im JSON nicht vorhanden ist

WBOY
WBOYnach vorne
2024-02-09 08:12:08786Durchsuche

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

Laut der Einführung des PHP-Editors Zimo wird der Zeigerwert beim Parsen von JSON-Daten durch json.Unmarshal in Golang nicht explizit auf Null gesetzt, wenn ein Feld im JSON nicht vorhanden ist. Das bedeutet, dass der Zeiger auch dann seinen ursprünglichen Wert behält, wenn ein Feld im JSON fehlt, was möglicherweise zu Fehlern oder Ausnahmen in Ihrem Programm führt. Daher müssen wir bei der Verwendung von json.Unmarshal besonderes Augenmerk auf den Umgang mit fehlenden Feldern legen, um die Stabilität und Korrektheit des Programms sicherzustellen.

Frageninhalt

Betrachten Sie dieses Beispiel:

<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>

Was ergibt:

first: {Field:a} &{Field:b}
second: {Field:c} &{Field:b}
third: {Field:} <nil>

Wenn ich json.Unmarshal zum ersten Mal ausführe, erscheint StructB in der Antwort und wird ordnungsgemäß entmarshallt. Aber wenn ich das ein zweites Mal mache, scheint es nicht explizit auf Null gesetzt zu werden, wenn das Feld nicht in der Antwort angezeigt wird. Wenn Sie dies für eine Struktur tun, in der dieses Feld nicht festgelegt ist, wird es auf Null gesetzt (oder anscheinend nicht auf etwas gesetzt) ​​(wie im dritten Beispiel gezeigt).

Wenn ich struct_b auf ungleich Null gesetzt habe, wie kann ich mein Beispiel so ändern, dass beim Parsen einer JSON-Zeichenfolge, die kein struct_b-Feld enthält, das zweite struct_b 设置为非 nil,如何更改我的示例,以便在解析其中不包含 struct_b 字段的 JSON 字符串时,第二个 json.Unmarshal 将显式将 StructB 设置为 nil ?

解决方法

你不能。 json.Unmarshal 不会修改输入 JSON 中未表示的结构字段。要么使用空结构开始,要么在调用 Unmarshal dies tut? StructB explizit auf Null setzen?

🎜Lösung🎜🎜Das geht nicht. 🎜 Strukturfelder, die nicht im Eingabe-JSON dargestellt sind, werden nicht geändert. Beginnen Sie entweder mit einer leeren Struktur oder setzen Sie alle Felder auf den gewünschten Wert, bevor Sie Unmarshal aufrufen, wenn sie nicht in der JSON-Eingabe enthalten sind. 🎜

Das obige ist der detaillierte Inhalt vonGolangs json.Unmarshal setzt einen Zeigerwert nicht explizit auf Null, wenn das Feld im JSON nicht vorhanden ist. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen