请考虑以下示例:
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
}
其输出:
first: {Field:a} &{Field:b}
second: {Field:c} &{Field:b}
third: {Field:} <nil>
当我第一次执行json.Unmarshal
时,StructB出现在响应中,并且被正确地解组。但是当我第二次这样做的时候,当字段没有在响应中出现的时候,它似乎没有显式地将其设置为nil。当对一个没有设置这个字段的结构体执行此操作时,它确实将其设置为nil(或者显然没有将其设置为某个值)(如第三个示例所示)。
如果我已经将struct_b
设置为not nil,那么我如何改变我的示例,以便第二个json.Unmarshal
在解析一个没有struct_b
字段的JSON字符串时将StructB
显式设置为nil?
1条答案
按热度按时间slmsl1lt1#
你不能。
json.Unmarshal
不会修改输入JSON中没有表示的结构字段。要么使用一个空的结构体开始,要么在调用Unmarshal
之前将任何字段设置为您希望它们具有的任何值(如果它们不在JSON输入中)。