为了账号安全,请及时绑定邮箱和手机立即绑定

json.解码一个 TCP 连接并在 Go 中同时记录原始数据

json.解码一个 TCP 连接并在 Go 中同时记录原始数据

Go
繁星点点滴滴 2022-06-21 09:55:36
我正在使用 ajson.Decoder将 a 解码net.Conn为自定义结构。我还想记录在net.Conn不修改的情况下发送的原始 JSON 字符串。我正在寻找一种有效的方法来实现这一目标。我目前有以下代码:reader := bufio.NewReader(conn)   // conn is a net.Conndec := json.NewDecoder(reader)for {       // How can I also log the original data before decoding it into the struct?    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...}
查看完整描述

2 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

使用iotest.NewReadLogger在读取数据时记录数据:


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...


}

    

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


查看完整回答
反对 回复 2022-06-21
?
大话西游666

TA贡献1817条经验 获得超14个赞

您可以使用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)

}


查看完整回答
反对 回复 2022-06-21
  • 2 回答
  • 0 关注
  • 120 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信