根据你提供的信息,Redis 中的 ipv4Addresses
字段存储的是一个字符串格式的 JSON 数组,例如:
"[\"192.168.1.1\", \"10.0.0.1\"]"
而你的 Go 结构体 NfProfile
中的 Ipv4Addresses
字段期望是一个字符串切片([]string
)。因此,直接尝试将这个字符串反序列化为 Go 结构体时会失败,因为它不能直接将字符串解析成数组。
解决方法
你可以在解码之前先处理这个字段,将其从字符串转换为实际的 JSON 格式,然后再进行反序列化。下面是一个具体的实现步骤:
步骤 1: 自定义类型和 Unmarshal 方法
你可以创建一个自定义类型来处理这个情况,并实现 json.Unmarshaler
接口。示例如下:
package models
import (
"encoding/json"
"fmt"
)
// NfProfile 是包含网络功能实例信息的结构体
type NfProfile struct {
NfInstanceId string `json:"nfInstanceId" yaml:"nfInstanceId" bson:"nfInstanceId" mapstructure:"NfInstanceId"`
// ...其他字段...
Ipv4Addresses JsonStringArray `json:"ipv4Addresses,omitempty"`
}
// JsonStringArray 用于处理存储为JSON数组形式的字符串
type JsonStringArray []string
// UnmarshalJSON 实现 json.Unmarshaler 接口
func (a *JsonStringArray) UnmarshalJSON(data []byte) error {
// data 是传入的原始数据,需要去掉引号并解析
var raw string
if err := json.Unmarshal(data, &raw); err != nil {
return err
}
// 将解析得到的原始字符串作为 JSON 再次解析为切片
return json.Unmarshal([]byte(raw), a)
}
步骤 2: 使用新的类型进行解码
然后,你可以像平常一样使用这个结构体,只需确保在获取到 Redis 数据后,调用对应的反序列化逻辑即可:
modifiedData := models.NfProfile{}
if err := json.Unmarshal(modified, &modifiedData); err != nil {
fmt.Printf("Error unmarshalling data: %v\n", err)
}
小结
通过以上步骤,你能够将 Redis 中以字符串形式存储的 JSON 数组正确地反序列化为 Go 的切片。这种方式确保了代码可读性和灵活性,同时解决了由于数据格式不匹配导致的问题。
内容由零声教学AI助手提供,问题来源于学员提问