Json 解码TCP连接并同时在Go中记录原始数据

Json 解码TCP连接并同时在Go中记录原始数据,json,go,tcp,copy,reader,Json,Go,Tcp,Copy,Reader,我正在使用json.Decoder将net.Conn解码为自定义结构。我还想记录在net.Conn上发送的原始JSON字符串,而不修改它 我正在寻找一种有效的方法来实现这一点。我目前拥有以下代码: reader:=bufio.NewReader(conn)//conn是一个net.conn dec:=json.NewDecoder(读取器) 对于{ //在将原始数据解码到结构中之前,如何记录原始数据? var dst customStruct 如果err=dec.Decode(&dst);err

我正在使用
json.Decoder
net.Conn
解码为自定义结构。我还想记录在
net.Conn
上发送的原始JSON字符串,而不修改它

我正在寻找一种有效的方法来实现这一点。我目前拥有以下代码:

reader:=bufio.NewReader(conn)//conn是一个net.conn
dec:=json.NewDecoder(读取器)
对于{
//在将原始数据解码到结构中之前,如何记录原始数据?
var dst customStruct
如果err=dec.Decode(&dst);err==io.EOF{
打破
}否则,如果错误!=零{
log.Errorf(“未能解码消息:%s”,错误)
打破
}
//用dst做点什么。。。
}

您可以使用
ioutil.ReadAll()
然后打印并解码字节。但是,由于您在不使用缓冲区的情况下读取所有字节,因此理想情况下应该将其置于
debug
标志检查之后

bs,err := ioutil.ReadAll()
if err != nil {
    panic(err)
}

log.Printf("output: %s", string(bs))

var dst customStruct
if err := json.Unmarshal(bs, &dst); err != nil {
    panic(err)
}
用于在读取数据时记录数据:

prefix := fmt.Sprintf("%p:", conn)
reader := bufio.NewReader(iotest.NewReadLogger(prefix, conn)) 
dec := json.NewDecoder(reader)

for {   

    var dst customStruct
    if err = dec.Decode(&dst); err == io.EOF {
        break
    } else if err != nil {
        log.Errorf("failed to decode message: %s", err)
        break
    }

    // do something with dst...

}
    

如果读取记录器输出不符合您的口味,则根据需要进行复制和调整。实现非常简单。

谢谢!理想情况下,所有内容都应该被缓冲。我已经从原始问题中删除了“出于调试目的”,因为它也需要登录到生产中。