go gin 动态解析post的JSON数据

传统方式

在使用gin框架时,每次解析复杂一点的JSON数据,都需要提前写好struct,然后用ShouldBind方法:
post的JSON数据如下:

{
    "trayCode":"123",
    "batCodes":[
        {
            "position":1,
            "batCode":"test1"
        },
        {
            "position":2,
            "batCode":"test2"
        }
    ]
}

提前写好Struct:

type Parameter struct {
	TrayCode string            `json:trayCode`
	BatCodes []BatPositionInfo `json:batCodes`
}
type BatPositionInfo struct {
	BatCode  string `json:batCode`
	Position int    `json:position`
}

使用:

func main() {
	r := gin.Default()
	
	r.POST("/post", func(c *gin.Context) {
		p := &Parameter{BatCodes: make([]BatPositionInfo, 0)}
		err := c.ShouldBind(p)
		if err != nil {
			fmt.Println(err)
		} else {
			fmt.Println(p)
		}
		c.JSON(200, gin.H{
			"msg": "this is a post msg",
		})
	})

	panic(r.Run(":2500"))
}

动态方式

动态的方式,不需要提前声明struct,解析的时候,将json解析为map,
然后解析map中的数据

func main() {
	r.POST("/post", func(c *gin.Context) {
		json := make(map[string]interface{})
		err := c.BindJSON(&json)
		if err != nil {
			fmt.Printf("bind error:%v\n", err)
		} else {
			traycode := json["trayCode"]
			fmt.Printf("traycode:%v\n", traycode)

			obj := json["batCodes"]

			batCodes := make([]BatPositionInfo, 0)
			for _, val := range obj.([]interface{}) {
				dic, _ := val.(map[string]interface{})
				pos := BatPositionInfo{
					BatCode:  dic["batCode"].(string),
					Position: int(dic["position"].(float64)),
				}
				batCodes = append(batCodes, pos)
			}
			fmt.Printf("batCodes:%v\n", batCodes)
		}
		c.JSON(200, gin.H{
			"msg": "this is a post msg",
		})
	})
	panic(r.Run(":2500"))
}

匿名struct的方式

func main() {
	r := gin.Default()
	
	r.POST("/post", func(c *gin.Context) {
		obj := struct {
			TrayCode string `json:"trayCode"`
			BatCodes []struct {
				Position int    `json:"position"`
				BatCode  string `json:"batCode"`
			} `json:"batCodes"`
		}{}

		err := c.BindJSON(&obj)
		if err != nil {
			fmt.Println(err)
		} else {
			fmt.Println(obj)
		}

		c.JSON(200, gin.H{
			"msg": "this is a post msg",
		})
	})

	panic(r.Run(":2500"))
}

综合以上三种方式,个人更喜欢匿名struct的方式

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值