json - Go 语言 Redis : Map & Slice

标签 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       string       `json:"type"`
}

在 Redis 中,哈希字段包含字符串化的 JSON。

HGET hashname fieldname

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

现在“过滤器”键可以是基于类型的数组或映射(这就是为什么我将过滤器类型定义为结构中的接口(interface))。
我将 JSON 编码如下:

var p Person
content, err := redis.HGet("hashName", "id").Result()
_ = json.Unmarshal([]byte(content), &p)

现在我必须像下面这样遍历过滤器,但这会导致错误cannot range over p.Filters (type interface {})(我明白为什么会出现这个错误来了)

for _, filter := range p.Filters {
  fmt.Println(filter)
}

我们有什么办法可以处理这种情况吗?

谢谢,
沙山

最佳答案

您需要将 Filters 类型 interface{} 转换为预期的 slice 。如果您真的不知道它将是什么类型,您可以使用 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("%T\n", i)
    }
}

关于json - Go 语言 Redis : Map & Slice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53342831/

相关文章:

json - SWIFT 中带有自定义参数的发布请求

java - 使用 GSON 反序列化 JSON 文件

firebase - 如何从 firebase 获取多条记录?

go - go get 的二进制文件在哪里安装?

node.js - Redis:按分数排序的集合的交集

python - 遍历 Redis 键

json - Azure 数据工厂复制事件 JSON 数据类型转换问题

php - Wordpress:从 WP REST API JSON 文件中删除不需要的 html 标签

go - 确保我的 Go 页面查看计数器没有被滥用

redis - 相交 zset 和 set 在 Redis 中不起作用