之前用go写了个web服务器,因为用的是RESTFul的URL方式收发消息,所以必然会涉及到解析消息body。
先贴代码。只贴需要的部分,其他的就不贴了,关于怎么用go创建restful复位,我的其他帖子里面有写。
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
//msgNode 222
type msgNode struct {
ID string `json:"id"`
Name string `json:"name"`
}
//MsgBody ddd
type MsgBody struct {
Vms []msgNode `json:"node"`
}
//CreateVMProcess
func CreateVMProcess(uuid string, r *http.Request) []byte {
fmt.Println(CurrentTime(), "CreateVMProcess: uuid is", uuid)
//解析body
reqBody := new(MsgBody )
body, err := ioutil.ReadAll(r.Body)
if err != nil {
fmt.Println(CurrentTime(), "CreateVMProcess: get body failed")
return resultFAIL(20180005, "CreateVMProcess: parse req msg body failed.")
}
err = json.Unmarshal(body, &reqBody)
if err != nil {
fmt.Println(CurrentTime(), "CreateVMProcess: Unmarshal data failed")
return resultFAIL(20180006, "CreateVMProcess: Unmarshal vmdate failed.")
}
fmt.Println(CurrentTime(), reqBody)
}
go语言有一点不好,函数名,参数名里面有下划线的时候,会有告警。吐槽一下。
go语言对应json的处理很简单,不需要去按个取参数值,我们只需要定义一个结构体,然后Unmarshal就可以了。这个函数会把json消息按照你给的结构体去解析,并且填写值,简单吧。
这里需要注意的是
type msgNode struct {
ID string `json:"id"`
Name string `json:"name"`
}
定义json结构体的时候,里面的参数首字母一定要大写,不要问我为什么,想知道就去研究encoding/json的源码。而且名字不要随便取,跟json消息里面的对应上,如:
{
"node":[{
"id":"",
"name":"",
"index":0,
"user_name":""
}]
}
像这样的json消息,你需要建两个结构体。
type msgNode struct {
ID string `json:"id"`
Name string `json:"name"`
Index int `json:"index"`
UserName string `json:"user_name"`
}
type msgBody struct {
Node []msgNode `json:"node"`
}
你的消息参数,决定了你的结构体定义,对于有起名困难症的人来说,这是个好消息,不用那么纠结了。
不知道你们有观察到没,user_name,json消息参数有这个,按照规则我们参数名应该是User_name。
这就是我之前吐槽的,go的参数名不能有下划线,但是我们可以用UserName,这样也可以解析。