登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-14 21:12:34 383浏览 收藏

在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《json.在 Go 中解码 TCP 连接并同时记录原始数据》,聊聊,希望可以帮助到正在努力赚钱的你。

问题内容

我正在使用 json.decodernet.conn 解码为自定义结构。我还想记录在 net.conn 上发送的原始 json 字符串而不对其进行修改。

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

reader := bufio.NewReader(conn)   // conn is a net.Conn
dec := 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...

}
    

解决方案


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

}

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

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

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>