Json GoLang Redis:地图和地图;片
我使用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
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)
}
}