如何在Go中打印JSON

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

2
c.ResponseWriter中的“c”来自哪里? - kev
如果 err == nil { panic(err) } 只需将条件更改为 err != nil - Vadim Kozak
3个回答

15

有几种方法可以得到你要找的内容。

首先,直接回答你的问题,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)形式方法的某个东西。您可以通过直接在ResponseWriter上调用Write()方法将该[]byte数据写入ResponseWriter

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

这样就稍微不那么尴尬了。事实证明,有一个更好的方法来做这件事:使用json.Encoderjson.Encoder是一个嵌入了io.Writer的结构体,有效地向任何io.Writer结构体添加了一个Encode方法,该方法可以将结构体编码为JSON并将其写入该writer。区别在于,你所做的是将数据编码为内存中的字节切片,然后将其复制到io.Writer中,而你可以直接将其写入,像这样:

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

现在连那个中间的[]byte格式都没有了。


2

您正在使用json_msg作为Printf类型函数中的格式字符串,而该函数仅接受string作为格式字符串([]bytestring是不同的类型,尽管它们可以互相转换)。编写字节切片的正确方式是指定格式字符串:

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

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

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

[]byte正确转换为string的方法是什么?


通常情况下,如果不必要的话进行强制类型转换被认为是糟糕的内存管理。强制类型转换会创建一个副本,在这种特殊情况下,你有其他很好的选择(Write() 和 FPrintf("%v"))。 - amattn
是的,在将字节转换为字符串的情况下需要进行强制类型转换。但他的问题表明他对于如何正确进行类型转换存在一些无知。我试图解决这个问题。 - Jeremy Wall
该调用中缺少格式字符串。 - thwd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接