如何将 map[string]interface{} 打印为 json?

sib*_*ert 2 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)
}
Run Code Online (Sandbox Code Playgroud)

使用%#v时的输出

fmt.Fprintf(w,"%#v \n", results)
Run Code Online (Sandbox Code Playgroud)

地图[字符串]接口 {}{"USER_ID":"JD", "USER_NAME":"John Doe"}

地图[字符串]接口 {}{"USER_ID":"JAD", "USER_NAME":"Jane Doe"}

map[string]interface {}{"USER_ID":"DD", "USER_NAME":"Donald Duck"}

仅使用%v

fmt.Fprintf(w,"%v \n", results)
Run Code Online (Sandbox Code Playgroud)

地图[USER_ID:JD USER_NAME:John Doe]

地图[USER_ID:JAD USER_NAME:Jane Doe]

地图[USER_ID:DD USER_NAME:唐老鸭]

所需的输出是摆脱map[string]interface {}

{"USER_ID":"JD", "USER_NAME":"John Doe"}

{"USER_ID":"JAD", "USER_NAME":"Jane Doe"}

{"USER_ID":"DD", "USER_NAME":"Donald Duck"}

这可能吗?

使用 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)
    }
  }
Run Code Online (Sandbox Code Playgroud)

{"USER_ID":"JD","USER_NAME":"John Doe"}

{"USER_ID":"JAD","USER_NAME":"Jane Doe"}

{"USER_ID":"DD","USER_NAME":"Donald Duck"}

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

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)
}
Run Code Online (Sandbox Code Playgroud)

地图[USER_ID:JD USER_NAME:John Doe]

地图[USER_ID:JAD USER_NAME:Jane Doe]

地图[USER_ID:DD USER_NAME:唐老鸭]

还有一个问题。如何将正确的结果打印到 BROWSER?

Tim*_*nes 5

如果要将输出格式化为 JSON,最好使用该json包。这篇博文中有一篇关于 json 处理的写得很好的介绍,但通常该Marshal函数很乐意获取它能够编组的任何其他类型的map[string]interface{}位置的映射interface{}

b, err := json.Marshal(m)
Run Code Online (Sandbox Code Playgroud)

这将返回一个字节数组,因此您需要将其转换为字符串:

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))
Run Code Online (Sandbox Code Playgroud)

https://play.golang.org/p/rffsuI4BL35

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

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)
}
Run Code Online (Sandbox Code Playgroud)

https://play.golang.org/p/l2-BOUK3yn9

对于您的代码,它看起来像这样:

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
    }
}
Run Code Online (Sandbox Code Playgroud)