我写了剩下的api但是身体在golang中返回nil。为什么返回&#34; 0 {<nil> false [] <nil> false 0 <nil> 0}&#34;

时间:2016-05-08 08:51:15

标签: go jira-rest-api

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 =&amp; {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 个答案:

答案 0 :(得分:0)

如果您检查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}

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