我写了其余的 api,但正文在 golang 中返回零。为什么要返回"0 {<nil> false [] <nil> false 0 <nil> 0}"


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))
}

和数据库的数据类型

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"`
}

为什么要返回

请求正文 : %!(额外的*json。解码器=&{0xc820012b00 [] {[] 0 { 假 [] 假 0 0} { 假 [] 假 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
}

如果你检查源代码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 : %+vn", apdata)
}

输出:

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

RssiMaxRssiMin 为零,因为它们是接收负值的无符号整数。

最新更新