我想从服务器读取完整的响应,但是我不知道它的确切大小。
我希望它能起作用:
message, err := ioutil.ReadAll(conn)
但是服务器未发送EOF,因此该语句挂起。
我知道它是一个JSON响应,因此我可以读取数据直到最后一个},但这似乎并不是实现它的最佳方法。
阅读完整回复的最佳实践是什么?
更新:
过了一会儿,我发现这种方式是可能的:
var m map[string]interface{}
d := json.NewDecoder(conn)
d.Decode(&m)
for key, value := range m {
fmt.Print(key)
fmt.Print(" : ")
fmt.Print(value)
fmt.Print("\n")
switch vv := value.(type) {
case map[string]interface{}:
for k, v := range vv {
fmt.Print(k)
fmt.Print(" : ")
fmt.Print(v)
fmt.Print("\n")
}
}
}
答案 0 :(得分:1)
您想要一个json.Decoder
。解码器用于读取JSON对象流。它从流中读取直到接收到完整的对象,然后将其解组到提供的对象指针上。
示例:
package main
import (
"encoding/json"
"fmt"
"io"
)
func main() {
pr, pw := io.Pipe()
go pw.Write([]byte(`{"foo":"bar"}`))
var data map[string]string
json.NewDecoder(pr).Decode(&data)
fmt.Printf("Data: %v\n", data)
}
https://play.golang.org/p/JQMXGzrDAH-
哪个输出:
Data: map[foo:bar]
答案 1 :(得分:1)
使用json.Decoder。阅读多个消息的方法如下:
d := json.NewDecoder(conn)
for {
var m message // <-- use whatever type is appropriate for your app
err := d.Decode(&m)
if err == io.EOF {
break
} else if err != nil {
// handle error
}
// do something with m
}
如果只希望收到一条消息,请删除循环。