首页 > 解决方案 > 无法将字符串映射转换为 json

问题描述

我想使用redigo从 redis 收到的哈希中制作一个 json :

func showHashtags(c *gin.Context) {
    hashMap, err := redis.StringMap(conn.Do("HGETALL", MyDict))
    if err != nil {
        fmt.Println(err)
    }    
    fmt.Println(hashMap) //works fine and shows the map 

    m := make(map[string]string)
    for k, v := range hashMap {
        m[k] = v
    }

    jmap, _ := json.Marshal(m)
    c.JSON(200, jmap)
}

但是浏览器中的结果是乱码,例如:

"eyIgIjoiMiIsIjExX9iq24zYsSAiOiIxIiwiQWxsNFJhbWluICI6IjEiLCJCSUhFICI6IjMiLCJCVFNBUk1ZICI6IjIiLCJDTUJZTiAiOiIxI....

这里有什么问题?我该如何解决?

标签: jsongohashredisredigo

解决方案


变量jmap是 type []bytec.JSON()正如您在输出中看到的那样,对编组中 JSON 编码器的调用[]byte作为 base64 编码的字符串。

要解决此问题,请通过将映射直接传递给 c.JSON 来使用一级 JSON 编码:

hashMap, err := redis.StringMap(conn.Do("HGETALL", MyDict))
if err != nil {
    // handle error
}    
m := make(map[string]string)
for k, v := range hashMap {
    m[k] = v
}

c.JSON(200, m)

因为hashMap是 a map[string]string,所以可以直接使用:

hashMap, err := redis.StringMap(conn.Do("HGETALL", MyDict))
if err != nil {
    // handle error
}    
c.JSON(200, hashMap)

推荐阅读