According to PHP editor Zimo’s introduction, when json.Unmarshal in Golang parses JSON data, if a field does not exist in the JSON, it will not make the pointer value explicit Set to nil. This means that even if a field is missing from the JSON, the pointer will still retain its original value, potentially causing errors or exceptions in your program. Therefore, when using json.Unmarshal, we need to pay special attention to handling missing fields to ensure the stability and correctness of the program.
Consider this example:
<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>
Which outputs:
first: {Field:a} &{Field:b} second: {Field:c} &{Field:b} third: {Field:} <nil>
When I execute json.Unmarshal
for the first time, the StructB appears in the response and is unmarshaled correctly. But when I do this a second time, it doesn't seem to explicitly set it to nil when the field isn't shown in the response. When doing this on a struct that doesn't have this field set, it does set it to nil (or apparently doesn't set it to something) (as shown in the third example).
If I have set struct_b
to non-nil, how can I change my example so that when parsing a JSON string that does not contain a struct_b
field, the second json.Unmarshal
Will explicitly set StructB
to nil?
You can't. json.Unmarshal
Structural fields that are not represented in the input JSON will not be modified. Either start with an empty structure, or set any fields to whatever value you want them to have (if they are not in the JSON input) before calling Unmarshal
.
The above is the detailed content of Golang's json.Unmarshal does not explicitly set a pointer value to nil if the field does not exist in the JSON. For more information, please follow other related articles on the PHP Chinese website!