博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang解析json格式 -- 全
阅读量:6939 次
发布时间:2019-06-27

本文共 2401 字,大约阅读时间需要 8 分钟。

项目中客户端和服务端的交互数据部分为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字段取出来,并且拼成结果串进行展示

  1. 从json数组中获取ws
  2. ws是数组,数组元素为object
  3. cw是数组,数组元素为object
  4. w是string
  5. 从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"` }

注意定义的时候变量名第一个字母要大写,也可以使用工具来自动生成定义;用工具生成的挺漂亮:

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) }

转载地址:http://hminl.baihongyu.com/

你可能感兴趣的文章
使用syslog-ng搭建日志服务器
查看>>
我的友情链接
查看>>
如何做好企业级邮件系统的安全防范技术?
查看>>
虚拟化VMware之存储与虚拟主机管理(2)
查看>>
我的友情链接
查看>>
shell中变量的间接引用
查看>>
二、lwip协议栈之telnet
查看>>
谈谈Ext JS的组件——布局的使用方法
查看>>
python入门书籍
查看>>
004-关闭文件后自动备份
查看>>
js实现当前导航菜单高亮显示
查看>>
sqlserver 分页
查看>>
php通过system()调用Linux命令问题
查看>>
swift 警告框 - 自定义按钮颜色,图片
查看>>
提高搜索引擎结果页面排名的各种技术
查看>>
刷题常用的STL容器总结
查看>>
sdut 1451 括号东东 (dp或模拟)
查看>>
POJ1002 487-3279
查看>>
Appium 在 Android UI 测试中的应用
查看>>
登录界面 动画背景效果
查看>>