Json GoLang Redis:地图和地图;片

Json GoLang Redis:地图和地图;片,json,go,redis,Json,Go,Redis,我使用GoLang从redis散列中获取数据,然后映射到一个结构中 type Person struct { ID string `json:"id"` FirstName string `json:"firstName"` LastName string `json:"lastName"` Filters interface{} `json:"filters"` Type st

我使用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 hashname字段名

上面返回一个字符串化的JSON

现在“filters”键可以是基于类型的数组或映射(这就是为什么我在struct中将filters类型定义为接口)。
我对JSON进行如下处理:

var p Person
content, err := redis.HGet("hashName", "id").Result()
_ = json.Unmarshal([]byte(content), &p)
现在我必须像下面这样在过滤器上循环,但这是一个错误,不能覆盖p.filters(类型接口{})(我理解为什么会出现这个错误)

我们有办法处理这种情况吗

谢谢,

Shashank

您需要将
过滤器
类型
接口{}
转换为所需的片。如果您不知道它将是什么类型,可以使用
map[string]接口{}
。因此,将
过滤器
类型更改为
map[string]接口{}

根据更多信息 如果<代码>筛选器< /代码>可以是一个数组(或不是),那么您可能会考虑一个<代码>类型开关:

一个简单的例子:

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("%T\n", i)
    }
}

如果使用map[string]接口{},则无法将数组分配给过滤器。(过滤器可以是数组或贴图)太棒了!我很高兴能帮上忙。您是否在问如何将JSON文本转换为Go值,其中JSON的元素可以是数组或对象?如果是,请给出JSON的两个变体的示例。Redis似乎与这个问题无关。
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("%T\n", i)
    }
}