您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

golang怎么解析json格式

2024/6/7 13:18:41发布10次查看
下面由golang教程栏目给大家介绍golang解析json格式的方法,希望对需要的朋友有所帮助!
项目中客户端和服务端的交互数据部分为json,因此在服务端就得解析,复杂的json解析起来其实还是挺费劲的。 
交互的数据类似如下格式:
{"sn":1,"ls":false,"bg":0,"ed":0,"ws":[{"bg":0,"cw":[{"sc":0,"w":"还"}]},{"bg":0,"cw":[{"sc":0,"w":"有点"}]},{"bg":0,"cw":[{"sc":0,"w":"眼熟"}]}]}
需要将json格式中的w字段取出来,并且拼成结果串进行展示
从json数组中获取wsws是数组,数组元素为objectcw是数组,数组元素为objectw是string从cw遍历获取w字段初步实现如下:
func recresultjsontoplain() { var recresult string var dat map[string]interface{} json.unmarshal([]byte(json_str), &dat) if v, ok := dat["ws"]; ok { ws := v.([]interface{}) for i, wsitem := range ws { wsmap := wsitem.(map[string]interface{}) if vcw, ok := wsmap["cw"]; ok { cw := vcw.([]interface{}) for i, cwitem := range cw { cwitemmap := cwitem.(map[string]interface{}) if w, ok := cwitemmap["w"]; ok { recresult = recresult + w.(string) } } } } } fmt.println(recresult)}
这样实现,一层一层去转换类型,再去获取元素有点麻烦。既然是已知的json数据结构,那么可以定义好结构体,再去进行解析。
type cwitem struct { sc int32 `json:"sc"` w string `json:"w"`}type wsitem struct { cw []cwitem}type iatresult struct { sn int32 `json:"sn"` ls bool `json:"ls"` bg int32 `json:"bg"` ed int32 `json:"ed"` ws []wsitem `json:"ws"`}
注意定义的时候变量名第一个字母要大写,也可以使用工具来自动生成定义https://mholt.github.io/json-to-go/;用工具生成的挺漂亮:
type autogenerated struct { sn int `json:"sn"` ls bool `json:"ls"` bg int `json:"bg"` ed int `json:"ed"` ws []struct { bg int `json:"bg"` cw []struct { sc int `json:"sc"` w string `json:"w"` } `json:"cw"` } `json:"ws"`}
func recresultjsontoplain(jsonresult []byte)(recplainresult string) { var r iatresult json.unmarshal(jsonresult, &r) for _, wsitem := range r.ws { for _, cwitem := range wsitem.cw { recplainresult = recplainresult + cwitem.w } } return recplainresult}
上面的元素有json:"sn"强制说明,因此如果只需获取对应的元素,其他元素不定义也是可以的。另外还有一种数据就是数组当中的元素还是数组,并且最后数组包含的是number或者string类型,需要再重写一个函数才行,数据如下,获取[21,1]当中的元素
{"asks": [[21, 1], [22, 1]] ,"bids": [[20, 1], [19, 1]]}
搜索到一段代码如下,重新实现了unmarshaljson
package mainimport ( "encoding/json" "fmt")type message struct { asks []order `json:"bids"` bids []order `json:"asks"`}type order struct { price float64 volume float64}func (o *order) unmarshaljson(data []byte) error { var v [2]float64 if err := json.unmarshal(data, &v); err != nil { return err } o.price = v[0] o.volume = v[1] return nil}func main() { b := []byte(`{"asks": [[21, 1], [22, 1]] ,"bids": [[20, 1], [19, 1]]}`) var m message if err := json.unmarshal(b, &m); err != nil { fmt.println(err) return } fmt.printf("%#v\n", m)}
更多golang相关技术文章,请访问go语言栏目!
以上就是golang怎么解析json格式的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product