如何在单个函数golang中解析来自不同文件的两个不同结构?

时间:2018-04-17 05:22:51

标签: json go

我想解码两个不同的结构,以便将数据保存到集合中。但它给出了错误。

下面给出了两个结构,这两个文件位于名为 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

我该如何解决这个问题?谁能帮我?谢谢。

1 个答案:

答案 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
}