亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 171 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號