ZBLOG

127.0.0.1:6379> hgetall nfprofile:NF_INSTANCE_ID_12222 1) "ipv4Addresses" 2) "[\"192.168.1.1\", \"10.0.0.1\"]" , err=%v json: cannot unmarshal string into Go struct field NfProfile.ipv4Addresses of type []string (,if err := json.Unmarshal(modif...

根据你提供的信息,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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=7114

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?