我使用GoLang从redis散列中获取数据,然后映射到结构中。
type Person struct {
ID string `json:"id"`
FirstName string `json:"firstName"`
LastName string `json:"lastName"`
Filters interface{} `json:"filters"`
Type string `json:"type"`
}
在Redis中,散列字段包含一个字符串化的JSON。
HGET哈希名称字段名称
Above返回一个字符串化的JSON。
现在,"filters"键可以是基于类型的数组或映射(这就是为什么我在结构中将filters类型定义为接口(
我整理JSON如下:
var p Person
content, err := redis.HGet("hashName", "id").Result()
_ = json.Unmarshal([]byte(content), &p)
现在我必须循环下面的过滤器,但这给出了无法在p范围内的错误。过滤器(类型接口{}((我理解为什么会出现这个错误(
for _, filter := range p.Filters {
fmt.Println(filter)
}
我们有办法处理这种情况吗?
谢谢,
Shashank
您需要将Filters
类型的interface{}
转换为所需的切片。如果你真的不知道它会是什么类型,你可以使用map[string]interface{}
。因此,将您的Filters
类型更改为map[string]interface{}
。
根据更多信息如果Filters
可以是一个数组(或不是(,那么您可能会考虑type switch
:
一个简单的例子:
package main
import (
"encoding/json"
"fmt"
)
func main() {
var i interface{}
//json.Unmarshal([]byte(`["hi"]`), &i)
json.Unmarshal([]byte(`{"a":"hi"}`), &i)
switch i.(type) {
case []interface{}:
println("ARRAY")
case map[string]interface{}:
println("NOT ARRAY")
default:
fmt.Printf("%Tn", i)
}
}