4

我是 Go 新手,无法弄清楚如何打印出我创建的 JSON。我正在使用“encoding/json”并得到一个 []byte 返回。但是,当我将其打印出来时,我得到:

cannot use json_msg (type []byte) as type string in function argument

收到此消息后,我尝试将 []byte 数组转换为字符串或空接口。但是我似乎无法让它工作。有任何想法吗?相关代码如下:

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
4

3 回答 3

15

有几种方法可以得到你正在寻找的东西。

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

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

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

首先,因为我们知道fmt.Fprintfaccept io.Writer,所以我们正在讨论一些具有 form 方法的东西Write([]byte) (int, error)。您可以通过直接调用方法将该[]byte数据写入:ResponseWriterWrite()ResponseWriter

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

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

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

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

于 2013-01-28T21:42:22.637 回答
2

json_msgPrintf类型函数中用作格式字符串,它仅string作为格式字符串除外([]byte并且string是不同的类型。尽管您可以将它们相互转换)。编写字节切片的正确方法是指定格式字符串:

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

这将打印[]byteUnicode 内容。您不应该使用变量作为 Fprintf/Printf 中的格式字符串。我认为这不会像在 C 中那样有问题。但如果 JSON 中出现“%”,则可能会导致问题。

于 2013-01-29T05:49:42.687 回答
1
fmt.Fprintf(c.ResponseWriter, string(json_msg))

将您投射[]byte到一个string

于 2013-01-28T18:35:00.023 回答