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) 参考
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
