代码之家  ›  专栏  ›  技术社区  ›  Karlom

无法将字符串映射转换为json

  •  2
  • Karlom  · 技术社区  · 7 年前

    我想用从redis接收到的散列生成一个json redigo :

    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....
    

    这里怎么了?我怎样才能修好它?

    1 回复  |  直到 7 年前
        1
  •  7
  •   Cerise Limón    7 年前

    变量 jmap IS型 []byte 。调用json编码器 c.JSON() 元帅 [字节] 作为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 是一个 map[string]string ,可以直接使用:

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