go gin 动态解析post的JSON数据

Posted lishuangquan1987

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 := &ParameterBatCodes: 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"))

以上是关于go gin 动态解析post的JSON数据的主要内容,如果未能解决你的问题,请参考以下文章

Gin简单明了的教程---上

go的web框架-gin

Go语言-整合gin-swagger生成API文档

gin-post数据

gin go并发案例

[go]gin框架