2016-05-08 4 views
2
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)) 
} 

und Datentyp für dbIch schrieb den Rest api, aber der Körper ist zurück Null in Golang. Warum Rückkehr "0 {<nil> false [] <nil> false 0 <nil> 0}"

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

Warum Rückkehr

Anfrage Körper:% (EXTRA * json .Decoder = & 0xc820012b00 {[] {[] 0 { false [] false 0 0} {false [] false 0 0} false} 0 {false [] false 0 0 0} []})

auch json:

{ 
"mac":"01:0a:95:9d:68:20", 
"rssi_max":-73.50, 
"rssi_min":-50.02, 
"loc_def_id":1 
} 
+0

In der Anweisung 'fmt.Printf' gibt es keinen Formatbezeichner (z. B.'% d'). – Ralph

Antwort

0

Wenn Sie den Quellcode für json.Decoder untersuchen,

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

können Sie sehen, dass NewDecoder nur das r Feld setzt, und das ist, was Sie beobachten in der Ausgang von fmt.Printf.

Bis Sie err := decoder.Decode(&apdata) ausführen, wird Ihre Struktur nicht ausgefüllt. Was Sie in der Ausgabe sehen, ist der Inhalt des Decoders, nicht der Körper oder Ihre Struktur.

Wenn Sie Ihre Struktur drucken, nachdem err := decoder.Decode(&apdata) ausgeführt wird, enthält es die richtige Daten:

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

Ausgang:

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

Die RssiMax und RssiMin Null sind, weil sie nicht signierte Ints empfangen negative Werte sind.

+0

Danke, ich arbeite daran. Ich melde mich bei Ihnen zu diesem Thema –

+0

Hey Ralph, vielen Dank. Ich habe gerade vergessen, das Json-Modell hinzuzufügen. :) Daten haben die db erreicht. –