如何在Go中打印出JSON

时间:2013-01-28 17:08:49

标签: json go

我是Go的新手,无法弄清楚如何打印出我创建的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

3 个答案:

答案 0 :(得分:11)

有一些方法可以获得你想要的东西。

首先,直接回答您的问题,fmt.Fprintf,如果类型为func(io.Writer, string, ...interface{})。由于你将c.ResponseWriter传递给它,我认为这是满足io.Writer的东西。 fmt.Fprintf的第二个参数是格式字符串。如果你想打印一些字符串,你可以使用%s格式字符串,所以你想要的是:

fmt.Fprintf(c.ResponseWriter, "%s", json_msg)

直接回答你的问题,但让我们更进一步:是解决你正在解决的问题的正确方法吗?不,不是真的;这样做有点奇怪。

首先,因为我们知道fmt.Fprintf接受io.Writer,所以我们正在讨论使用Write([]byte) (int, error)形式的方法。您可以直接在[]byte上调用ResponseWriter方法,将Write()数据写入ResponseWriter

_, err := c.ResponseWriter.Write(json_msg)

那个略微不那么尴尬。事实证明,有一种甚至更好的方法:使用json.Encoderjson.Encoder嵌入 io.Writer的结构,有效地向任何io.Writer结构添加Encode方法,该方法将结构编码为json和把它们写给作家。不同之处在于,您所做的是将数据编码到内存中的字节切片,然后将其复制到io.Writer,直到您可以直接写入,如下所示:

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

现在你甚至没有那种中间[]byte格式。

答案 1 :(得分:2)

您使用json_msg作为Printf类型函数中的格式字符串,其格式字符串string[]byte除外string除外不同的类型。虽然你可以把它们互相投射)。编写字节片的正确方法是指定格式字符串:

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

这将打印[]byte作为其Unicode内容。你不应该使用varibles作为Fprintf / Printf中的格式字符串。我不认为它会像在C中那样成问题。但如果一个"%"它可能会导致问题。加入你的JSON。

答案 2 :(得分:1)

fmt.Fprintf(c.ResponseWriter, string(json_msg))

[]byte投放到string

是正确的方法