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

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

我寫了其余的 api 但 body 在 golang 中返回 nil 。

我寫了其余的 api 但 body 在 golang 中返回 nil 。

Go
料青山看我應如是 2022-01-10 14:27:12
func InsertApData(w http.ResponseWriter, r *http.Request) {    decoder := json.NewDecoder(r.Body)    fmt.Printf("Request Body : ", decoder)    var apdata models.ApData    err := decoder.Decode(&apdata)    check(b.E(err))    _, err2 := stmt.InsertApData.Exec(apdata.Mac, apdata.RssiMax, apdata.RssiMin, apdata.LocDefId)    check(b.E(err2))}和 db 的數據類型type ApData struct {    ID       int    `db:"id"`    Mac      string `db:"mac"`    RssiMax  uint64 `db:"rssi_max"`    RssiMin  uint16 `db:"rssi_min"`    LocDefId uint64 `db:"loc_def_id"`}為什么要回來請求正文:%!(EXTRA *json.Decoder=&{0xc820012b00 [] {[] 0 { false [] false 0 0} { false [] false 0 0} false} 0 { false [] false 0 0} 0 [ ]})還有 json :{"mac":"01:0a:95:9d:68:20","rssi_max":-73.50,"rssi_min":-50.02,"loc_def_id":1}
查看完整描述

1 回答

?
MYYA

TA貢獻1868條經驗 獲得超4個贊

如果您檢查 的源代碼json.Decoder,


...

type Decoder struct {

    r     io.Reader

    buf   []byte

    d     decodeState

    scanp int // start of unread data in buf

    scan  scanner

    err   error


    tokenState int

    tokenStack []int

}


func NewDecoder(r io.Reader) *Decoder {

    return &Decoder{r: r}

}

...

您可以看到NewDecoder僅設置r字段,這就是您在fmt.Printf.


在您執行之前err := decoder.Decode(&apdata),您的結構不會被填充。您在輸出中看到的是解碼器的內容,而不是正文或您的結構。


如果在運行后打印結構err := decoder.Decode(&apdata),它包含正確的數據:


package main


import (

    "fmt"

    "encoding/json"

    "strings"

)


func main() {

    input := `{

        "mac":"01:0a:95:9d:68:20",

        "rssi_max":-73.50,

        "rssi_min":-50.02,

        "loc_def_id":1

    }`


    decoder := json.NewDecoder(strings.NewReader(input))

    var apdata struct {

            ID       int    `db:"id"`

            Mac      string `json:"mac" db:"mac"`

            RssiMax  uint64 `json:"rssi_max" db:"rssi_max"`

            RssiMin  uint16 `json:"rssi_min" db:"rssi_min"`

            LocDefId uint64 `json:"loc_def_id" db:"loc_def_id"`

    }

    _ = decoder.Decode(&apdata)

    fmt.Printf("appdata : %+v\n", apdata)

}

輸出:


appdata : {ID:0 Mac:01:0a:95:9d:68:20 RssiMax:0 RssiMin:0 LocDefId:1}

的RssiMax和RssiMin是零,因為他們接受負值無符號整數。


查看完整回答
反對 回復 2022-01-10
  • 1 回答
  • 0 關注
  • 162 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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