golang中的json处理

golang中的json处理,第1张

概述JSON(Javascript Object Notation)已经成为了一种非常流行的数据交换格式,golang 自然不会忽视对 json 的支持,golang 自带的标准库就可以方便的处理 json。另外,推荐一种号称全世界最快的 JSON 解析器 -- jsoniter。 简介 json 中提供的处理 json 的标准包是 encoding/json,主要使用的是以下两个方法: // 序列化

JsON(JavaScript Object Notation)已经成为了一种非常流行的数据交换格式,golang 自然不会忽视对 Json 的支持,golang 自带的标准库就可以方便的处理 Json。另外,推荐一种号称全世界最快的 JsON 解析器 -- Jsoniter

简介

Json 中提供的处理 Json 的标准包是 enCoding/Json,主要使用的是以下两个方法:

// 序列化func Marshal(v interface{}) ([]byte,error)// 反序列化func Unmarshal(data []byte,v interface{}) error

序列化前后的数据结构有以下的对应关系:

bool,for JsON booleansfloat64,for JsON numbersstring,for JsON strings[]interface{},for JsON arraysmap[string]interface{},for JsON objectsnil for JsON null
Unmarshal

这是一个反序列化的过程,将 JsON 串重新组装成结构体。

已知解析类型

示例代码如下:

package mainimport (    "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)}

运行后,输出结果:[{name:Platypus Order:Monotremata} {name:Quoll Order:Dasyuromorphia}]
可以看出,结构体字段名与 JsON 里的 KEY 一一对应.
例如 JsON 中的 KEY 是 name,那么怎么找对应的字段呢?

首先查找 tag 含有 name 的可导出的 struct 字段(首字母大写)

其次查找字段名是 name 的导出字段

最后查找类似 name 或者 name 等这样的除了首字母之外其他大小写不敏感的导出字段

注意:能够被赋值的字段必须是可导出字段!!

同时 JsON 解析的时候只会解析能找得到的字段,找不到的字段会被忽略,这样的一个好处是:当你接收到一个很大的 JsON 数据结构而你却只想获取其中的部分数据的时候,你只需将你想要的数据对应的字段名大写,即可轻松解决这个问题。

未知解析类型

前面说的是,已知要解析的类型,比如说,当看到 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 mainimport (    "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))}

运行后,输出结果:

[{"name":"Platypus","order":"Monotremata"},{"name":"Quoll","order":"Dasyuromorphia"}]

可以发现,序列化得到的 Json 串的 key 名字跟结构体 Json tag 后指定的名字一样.
当结构体字段后无 Json tag 时,得到的 Json 串的 key 名与字段名一致。
Json tag 有很多值可以取,同时有着不同的含义,比如:

tag 是 "-",表示该字段不会输出到 JsON.

tag 中带有自定义名称,那么这个自定义名称会出现在 JsON 的字段名中,比如上面小写字母开头的 name.

tag 中带有 "omitempty" 选项,那么如果该字段值为空,就不会输出到JsON 串中.

如果字段类型是 bool,string,int,int64 等,而 tag 中带有",string" 选项,那么该字段在输出到 JsON 时,会把该字段对应的值转换成 JsON 字符串.

推荐的 Json 解析库

Jsoniter(Json-iterator)是一款快且灵活的 JsON 解析器,同时提供 Java 和 Go 两个版本。从 dslJson 和 Jsonparser 借鉴了大量代码。

Jsoniter 的 Golang 版本可以比标准库(enCoding/Json)快 6 倍之多,而且这个性能是在不使用代码生成的前提下获得的。

可以使用 go get github.com/Json-iterator/go 进行获取,完全兼容标准库的 MarshalUnmarshal方法。
使用时导入 github.com/Json-iterator/go 代替标准库,基本用法如下:

Jsoniter.Marshal(&data)Jsoniter.Unmarshal(input,&data)
参考

JSON处理

json iterator

总结

以上是内存溢出为你收集整理的golang中的json处理全部内容,希望文章能够帮你解决golang中的json处理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1277070.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存