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

xdnvmnnf  于 12个月前  发布在  Go
关注(0)|答案(1)|浏览(151)

请考虑以下示例:

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?

slmsl1lt

slmsl1lt1#

你不能。json.Unmarshal不会修改输入JSON中没有表示的结构字段。要么使用一个空的结构体开始,要么在调用Unmarshal之前将任何字段设置为您希望它们具有的任何值(如果它们不在JSON输入中)。

相关问题