如何在Go中打印JSON

如何在Go中打印JSON,json,go,Json,Go,我是新手,很难弄清楚如何打印出我创建的JSON。我使用的是“encoding/json”,返回了一个[]字节。但是,当我打印出来时,我得到: cannot use json_msg (type []byte) as type string in function argument 收到此消息后,我尝试将[]字节数组转换为字符串或空接口。然而,我似乎无法让它发挥作用。有什么想法吗?相关代码如下: type Message struct { Id int Name string }

我是新手,很难弄清楚如何打印出我创建的JSON。我使用的是“encoding/json”,返回了一个[]字节。但是,当我打印出来时,我得到:

cannot use json_msg (type []byte) as type string in function argument
收到此消息后,我尝试将[]字节数组转换为字符串或空接口。然而,我似乎无法让它发挥作用。有什么想法吗?相关代码如下:

type Message struct {
    Id int
    Name string
}



for _, row := range rows {
    m := Message{row.Int(0), row.Str(1)}

    json_msg, err := json.Marshal(m)

    if err == nil {
        panic(err)
    }//if

            //tried below to print out a interface, didn't work either
    //var f interface{}
    //err = json.Unmarshal(json_msg, &f)

    fmt.Fprintf(c.ResponseWriter, json_msg)
}//for

[]字节转换为
字符串

是一种正确的方法。有几种方法可以获得您想要的内容

首先,要直接回答您的问题,
fmt.Fprintf
if类型为
func(io.Writer,string,…interface{})
。既然您正在将
c.ResponseWriter
传递给它,我假设这是满足
io.Writer
的东西。
fmt.Fprintf
的第二个参数是格式字符串。如果要将某些内容打印为字符串,请使用
%s
格式字符串,因此您需要的是:

fmt.Fprintf(c.ResponseWriter, "%s", json_msg)
这直接回答了你的问题,但让我们更进一步:这是解决你正在解决的问题的正确方法吗?不,不是真的;这样做有点奇怪

首先,因为我们知道
fmt.Fprintf
接受
io.Writer
,所以我们讨论的是一种形式为
Write([]字节)(int,error)
的方法。通过直接调用
ResponseWriter
上的
write()
方法,您可以将
[]字节的数据写入
ResponseWriter

_, err := c.ResponseWriter.Write(json_msg)
那就不那么尴尬了。事实证明,有一种更好的方法可以做到这一点:使用
json.Encoder
json.Encoder
是一种结构,它嵌入了一个
io.Writer
,有效地向任何
io.Writer
struct添加了一个
Encode
方法,该方法将结构编码为json并将其写入写入写入器。区别在于,您所做的是将数据编码到内存中的一个字节片,然后将其复制到
io.Writer
,此时您可以直接写入,如下所示:

err := json.NewEncoder(c.ResponseWriter).Encode(m)

现在你甚至没有了中间的
[]字节
格式。

你在
Printf
类型函数中使用
json\u msg
作为格式字符串,它只将
字符串
作为格式字符串(
[]字节
字符串
是不同的类型。尽管你可以将它们相互转换)。写入字节片的正确方法是指定格式字符串:

fmt.Fprintf(WRITER_OBJ, "%s", json_msg)

这将打印
[]字节作为Unicode内容。在Fprintf/Printf中,不应将变量用作格式字符串。我认为这并不像在C中那样有问题。但是如果JSON中有一个“%”可能会导致问题。

通常认为在不必要时强制转换内存管理不好。强制转换会创建一个副本,在这种特殊情况下,您还有其他很好的选择(Write()和FPrintf(“%v”))是的,在将字节强制转换为字符串的情况下。但他的问题表明,他对如何正确地投下总的来说有些无知。我试图解决这个问题。该调用中缺少格式字符串。c.ResponseWriter的“c”来自哪里?如果err==nil{panic(err)},只需将条件更改为err!=无
fmt.Fprintf(WRITER_OBJ, "%s", json_msg)