如果 intermediate.Ipv4Addresses
是一个空字符串 (""
),那么在调用 json.Unmarshal
的时候将会出现问题,因为你试图将一个空字符串解码为数组。这会导致错误,因为空字符串并不是有效的 JSON 数组格式。
为了处理这种情况,可以在尝试解码之前检查该字段是否为空。以下是如何改进代码以避免这种情况的示例:
package main
import (
"encoding/json"
"fmt"
)
type CustomNfProfile struct {
Ipv4AddressesRaw string `json:"ipv4Addresses"`
Ipv4Addresses []string // 用于存储 IPv4 地址数组
}
// UnmarshalJSON 自定义解组函数,用于解析 CustomNfProfile 中的 Ipv4AddressesRaw 字段。
func (c *CustomNfProfile) UnmarshalJSON(data []byte) error {
type Alias CustomNfProfile
aux := &struct {
*Alias
}{
Alias: (*Alias)(c),
}
if err := json.Unmarshal(data, &aux); err != nil {
return err
}
if aux.Ipv4AddressesRaw == "" {
c.Ipv4Addresses = []string{} // 如果原始字符串为空,则初始化为一个空切片
return nil
}
var ipv4Array []string
err := json.Unmarshal([]byte(aux.Ipv4AddressesRaw), &ipv4Array)
if err != nil {
return err
}
c.Ipv4Addresses = ipv4Array
return nil
}
func main() {
jsonData1 := `{"ipv4Addresses":"[\"192.168.1.1\", \"10.0.0.1\"]"}`
jsonData2 := `{"ipv4Addresses":""}` // 测试空字符串的情况
var nfProfile1 CustomNfProfile
var nfProfile2 CustomNfProfile
err1 := json.Unmarshal([]byte(jsonData1), &nfProfile1)
if err1 != nil {
fmt.Println("Error unmarshalling JSON:", err1)
} else {
fmt.Printf("Parsed NfProfile 1: %+v\n", nfProfile1)
}
err2 := json.Unmarshal([]byte(jsonData2), &nfProfile2)
if err2 != nil {
fmt.Println("Error unmarshalling JSON:", err2)
} else {
fmt.Printf("Parsed NfProfile 2: %+v\n", nfProfile2)
}
}
修改说明:
- 在自定义的
UnmarshalJSON
方法中,在调用json.Unmarshal
解码之前,我们检查了aux.Ipv4AddressesRaw
是否为空。如果它是空的,我们直接将c.Ipv4Addresses
初始化为一个空切片,这样就避免了对空字符串进行解码操作。 - 这样处理后,代码能够安全地处理输入,包括空值情况,而不会引发运行时错误。
内容由零声教学AI助手提供,问题来源于学员提问