我想解码两个不同的结构,以便将数据保存到集合中。但它给出了错误。
下面给出了两个结构,这两个文件位于名为 models 的文件夹中。
User.go
type User struct {
Id int `json:"id" bson:"_id,omitempty"`
FirstName string `json:"first_name,omitempty" bson:"first_name,omitempty"`
LastName string `json:"last_name,omitempty" bson:"last_name,omitempty"`
EmailId string `json:"email_id,omitempty" bson:"email_id,omitempty"`
Password string `json:"password,omitempty" bson:"password,omitempty"`
PhoneNumber string `json:"phone_number,omitempty" bson:"phone_number,omitempty"`
AltPhoneNumber string `json:"alt_phone_number" bson:"alt_phone_number"`
Gender string `json:"gender,omitempty" bson:"gender,omitempty"`
Note string `json:"note,omitempty" bson:"note,omitempty"`
}
Provider.go
type Provider struct {
Id int `json:"id" bson:"_id,omitempty"`
Uid int `json:"uid" bson:"uid,omitempty"`
Speed string `json:"speed,omitempty" bson:"speed,omitempty"`
ProviderCategory string `json:"provider_category,omitempty" bson:"provider_category,omitempty"`
Priority int `json:"priority,omitempty" bson:"priority,omitempty"`
}
我尝试解码的代码
import (
"encoding/json"
"go-training/models"
"github.com/gin-gonic/gin"
"fmt"
)
var provider models.Provider
var user models.User
func SaveProvider(c *gin.Context) {
response := ResponseController{}
//decode the struct
providerErr := json.NewDecoder(c.Request.Body).Decode(&provider)
fmt.Println(providerErr) //Output:- nil
userErr := json.NewDecoder(c.Request.Body).Decode(&user)
fmt.Println(userErr) //output:- EOF
if userErr != nil {
fmt.Println("data is not properly formatted")
}
if providerErr != nil {
fmt.Printl?("data is not properly formatted")
}
}
以json形式输入的数据 -
{
"Id":1,
"Uid":1,
"speed":"new",
"provider_category":"WL",
"priority":1,
"first_name":"puneet",
"last_name":"jindal",
"email_id":"puneet@gmail.com",
"password":"poiuytrewq",
"phone_number":"9876543210",
"alt_phone_number":"9876543210",
"gender":"male",
"note":"phase 7"
}
错误: - EOF
我该如何解决这个问题?谁能帮我?谢谢。
答案 0 :(得分:5)
问题中的代码不起作用,因为第一个解码器读取整个请求主体。第二个解码器从EOF开始。
修复方法是将主体啜饮到一个字节切片并从该切片解组两次:
// slurp up the body. p is a []byte
p, err := ioutil.ReadAll(c.Request.Body)
if err != nil {
// handler error
}
var provider models.Provider
if err := json.Unmarshal(p, &provider); err != nil {
// handle error
}
var user models.User
if err := json.Unmarshal(p, &user); err != nil {
// handle error
}