我写了其余的 api 但 body 在 golang 中是 return nil 。为什么 returning "0 {<nil> false [] <nil> false 0 <nil> 0}"
I wrote the rest api but body is return nil in golang . Why returning "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))
}
和 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"`
}
为什么要返回
Request Body : %!(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
}
如果您检查 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
为零,因为它们是接收负值的无符号整数。
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"`
}
为什么要返回
Request Body : %!(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
}
如果您检查 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
为零,因为它们是接收负值的无符号整数。