golang中的json处理
JSON(Javascript Object Notation)已经成为了一种非常流行的数据交换格式,golang 自然不会忽视对 json 的支持,golang 自带的标准库就可以方便的处理 json。另外,推荐一种号称全世界最快的 JSON 解析器 -- 简介json 中提供的处理 json 的标准包是 // 序列化 func Marshal(v interface{}) ([]byte,error) // 反序列化 func Unmarshal(data []byte,v interface{}) error 序列化前后的数据结构有以下的对应关系: bool,for JSON booleans float64,for JSON numbers string,for JSON strings []interface{},for JSON arrays map[string]interface{},for JSON objects nil for JSON null Unmarshal这是一个反序列化的过程,将 JSON 串重新组装成结构体。 已知解析类型示例代码如下: package main import ( "encoding/json" "fmt" ) type Animal struct { Name string Order string } func main() { var jsonBlob = []byte(`[ {"Name": "Platypus","Order": "Monotremata"},{"Name": "Quoll","Order": "Dasyuromorphia"} ]`) var animals []Animal err := json.Unmarshal(jsonBlob,&animals) if err != nil { fmt.Println("error:",err) } fmt.Printf("%+v",animals) } 运行后,输出结果:
注意:能够被赋值的字段必须是可导出字段!!
未知解析类型前面说的是,已知要解析的类型,比如说,当看到 JSON arrays 时定义一个 golang 数组进行接收数据, 看到 JSON objects 时定义一个 map 来接收数据,那么这个时候怎么办?答案是使用 interface{} 进行接收,然后配合 type assert 进行解析,比如: var f interface{} b := []byte(`{"Name":"Wednesday","Age":6,"Parents":["Gomez","Morticia"]}`) json.Unmarshal(b,&f) for k,v := range f.(map[string]interface{}) { switch vv := v.(type) { case string: fmt.Println(k,"is string",vv) case int: fmt.Println(k,"is int ",vv) case float64: fmt.Println(k,"is float64 ",vv) case []interface{}: fmt.Println(k,"is array:") for i,j := range vv { fmt.Println(i,j) } } } Marshal这是序列化的过程,将结构体序列化成一个 JSON 串。 package main import ( "encoding/json" "fmt" ) type Animal struct { Name string `json:"name"` Order string `json:"order"` } func main() { var animals []Animal animals = append(animals,Animal{Name: "Platypus",Order: "Monotremata"}) animals = append(animals,Animal{Name: "Quoll",Order: "Dasyuromorphia"}) jsonStr,err := json.Marshal(animals) if err != nil { fmt.Println("error:",err) } fmt.Println(string(jsonStr)) } 运行后,输出结果:
可以发现,序列化得到的 json 串的 key 名字跟结构体 json tag 后指定的名字一样.
推荐的 json 解析库
jsoniter 的 Golang 版本可以比标准库(encoding/json)快 6 倍之多,而且这个性能是在不使用代码生成的前提下获得的。 可以使用 jsoniter.Marshal(&data) jsoniter.Unmarshal(input,&data) 参考
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |