Go 如何将map[string]接口{}打印为json?

Go 如何将map[string]接口{}打印为json?,go,Go,使用sqlx rows, err = db.Queryx(query) for rows.Next() { results := make(map[string]interface{}) err = rows.MapScan(results) fmt.Fprintf(w,"%#v \n", results) } 使用%#v fmt.Fprintf(w,"%#v \n", results) fmt.Fprintf(w,"%v \n", results) map[str

使用
sqlx

rows, err = db.Queryx(query)
for rows.Next() {
    results := make(map[string]interface{})
    err = rows.MapScan(results)
    fmt.Fprintf(w,"%#v \n", results)
}
使用%#v

fmt.Fprintf(w,"%#v \n", results)
fmt.Fprintf(w,"%v \n", results)
map[string]接口{}{“USER_ID”:“JD”,“USER_NAME”:“John Doe”}

映射[字符串]接口{}{“用户ID”:“JAD”,“用户名”:“Jane Doe”}

映射[字符串]接口{}{“用户ID”:“DD”,“用户名”:“唐老鸭”}

仅使用%v

fmt.Fprintf(w,"%#v \n", results)
fmt.Fprintf(w,"%v \n", results)
地图[用户ID:JD用户名:John Doe]

地图[用户ID:JAD用户名称:Jane Doe]

地图[用户ID:DD用户名称:唐老鸭]

所需的输出是去掉map[string]接口{}

{“USER_ID”:“JD”,“USER_NAME”:“John Doe”}

{“用户ID”:“JAD”,“用户名称”:“Jane Doe”}

{“用户名”:“DD”,“用户名”:“唐老鸭”}

这可能吗

使用JSON编辑

根据@Timothy Jones的说法,我已经更新了主代码,并且它按照预期工作。除了结果打印到终端而不是浏览器

rows, err = db.Queryx(query)
  for rows.Next() {
    results := make(map[string]interface{})
    err = rows.MapScan(results)
    if err := enc.Encode(results); err != nil {
      fmt.Fprintf(w,"%s\n", results)
    }
  }
{“USER_ID”:“JD”,“USER_NAME”:“John Doe”}

{“用户ID”:“JAD”,“用户名称”:“Jane Doe”}

{“用户名”:“DD”,“用户名”:“唐老鸭”}

删除错误处理只是为了测试。它会显示错误的结果,但会按应有的方式打印到浏览器中

rows, err = db.Queryx(query)
for rows.Next() {
  results := make(map[string]interface{})
  err = rows.MapScan(results)
  enc.Encode(results)
  fmt.Fprintf(w,"%s\n", results)
}
地图[用户ID:JD用户名:John Doe]

地图[用户ID:JAD用户名称:Jane Doe]

地图[用户ID:DD用户名称:唐老鸭]


还有一个问题。我如何将正确的结果打印到浏览器?

如果您想将输出格式化为JSON,最好使用这个包。JSON处理有一个写得很好的介绍,但通常
封送
函数很乐意获取
映射[string]接口{}
其中
接口{}
是它能够封送的任何其他类型:

b, err := json.Marshal(m)
这将返回一个字节数组,因此需要将其转换为字符串:

m := map[string]string{
    "USER_ID":"JD", 
    "USER_NAME":"John Doe",
}
b, err := json.Marshal(m)
if err != nil {
    log.Fatal(err)
}
fmt.Println(string(b))

但是,由于您知道只需打印编码结果,因此最好使用流式编码器:

m := map[string]string{
    "USER_ID":"JD", 
    "USER_NAME":"John Doe",
}
enc := json.NewEncoder(os.Stdout)

if err := enc.Encode(m); err != nil {
        log.Fatal(err)
}

对于您的代码,它如下所示:

enc := json.NewEncoder(w)
rows, err = db.Queryx(query)
// Note: you should check err here

for rows.Next() {
    results := make(map[string]interface{})
    err = rows.MapScan(results)
    // Note: You should check err here       

    if err := enc.Encode(results); err != nil {
         // Whatever you want to do in an encoding error
    }
}

你必须自己做,而不是依赖printfverb@Flimzy您能举个例子吗?看起来您想要的恰好是JSON编码,所以请使用encoding/JSON包。@Peter有没有链接或提示如何将encoding/JSON与sqlx一起使用?这与sqlx无关。您想格式化map[string]接口{}。使用MapScan填充的事实与此无关。encoding/json与标准库中的所有其他包一样。感谢您提供了详尽的答案!它确实为我指明了正确的方向,但仍然存在一些小问题。请看我的更新问题。我推荐您,您的更新问题与初始问题无关问一个新问题。哦,我没有看到你在原来的问题中给某个特定的
作者写了信。我已经编辑了我的答案。是的!效果更好。谢谢!但是数值编码不正确:“数量”:“MS4wMA==”。为什么?虽然这没有解决我的整个问题,但这是对我问题的准确回答。谢谢!