golang解析json格式 -- 全
2018-02-08 08:37
651 查看
项目中客户端和服务端的交互数据部分为json,因此在服务端就得解析,复杂的json解析起来其实还是挺费劲的。
交互的数据类似如下格式:
需要将json格式中的w字段取出来,并且拼成结果串进行展示
从json数组中获取ws
ws是数组,数组元素为object
cw是数组,数组元素为object
w是string
从cw遍历获取w字段
初步实现如下:
这样实现,一层一层去转换类型,再去获取元素有点麻烦。既然是已知的json数据结构,那么可以定义好结构体,再去进行解析。
上面的元素有
搜索到一段代码如下,重新实现了UnmarshalJSON
交互的数据类似如下格式:
{"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数组中获取ws
ws是数组,数组元素为object
cw是数组,数组元素为object
w是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"` }
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 main import ( "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解析json格式
- golang 字符串 json格式解析
- golang解析json格式数据
- golang解析json格式
- android中的http通讯----(4)客户端解析json格式
- gson解析json数据格式为object对象
- gson解析通过okhttp获取的json格式数据
- GSON解析复杂json数据格式
- JSON数据格式及解析上
- 让IIS支持解析.json格式文件
- java解析json格式的数据,其中json是List和Map格式
- iOS中解析 XML / JSON格式讲解
- 解决服务器返回错误数据格式导致Json解析出错造成app崩溃
- JQuery获取并解析php返回的json格式数据的简单示例
- 解析json格式的数据
- String类型的json体转换为json(json嵌套字符串json,嵌套字符串json数组等)转换并解析为需要的json格式
- Swift实现从url解析json格式数据
- 解析json格式
- java将xml解析,然后将其转换为json格式(①)