最近使用了Redis的Hash,把一个对象给存储到了hash里面,具体如下:
现在需要从RedisHash缓存里面把结果给取出来,同时赋值到一个对象上面
result, err := global.GVA_REDIS.HGetAll(context.Background(), key).Result()
问题是result是一个 map[string]string 类型,我们直接把map[string][string]给序列化成json字符串,是不符合我们预想的,因为map的值是string类型(为什么map的值不存int类型?因为redis只能存储字符串),但是对象上面有些属性是int类型的,导致我们反序列化失败
既然不能直接序列化map成为一个符合我们结果的json字符串,我们就自己构建一个json字符串
j := "{"
for k, v := range result {
j += "\"" +k + "\"" + ":" + v + ","
}
j =j[:len(j)-1]
j += "}"
err = json.Unmarshal([]byte(j), &ExamDetail)
然后我们再使用反序列化即可成功了
补充:
当一个对象被存储在Redis的Hash里面的时候,如果原本是int类型,那存储到Hash的时候,是没有字符串的两个"",如果是string类型,是会有"" ,但是其实两个value本质都是string,我们正是通过这个关键点,把map给反序列化到结构体上了,并成功对应其各种类型