加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Golang 的json处理

发布时间:2020-12-16 18:15:11 所属栏目:大数据 来源:网络整理
导读:Golang官网上有专门的包来处理json数据,https://golang.org/pkg/encoding/json/。 需要导入一个包 "encoding/json" import "encoding/json" 和其他语言处理类似,分为encode和decode两部分 encode 类似于php json_encode 的函数在这里为 Marshal 函数 func

Golang官网上有专门的包来处理json数据,https://golang.org/pkg/encoding/json/。
需要导入一个包"encoding/json"

import "encoding/json"

和其他语言处理类似,分为encode和decode两部分

encode

类似于php json_encode的函数在这里为Marshal函数

func Marshal(v interface{}) ([]byte,error)

php的函数json_encode是如果encode成功,返回一个string字符串,失败返回一个false
Golang和php类似,只不过是encode(这里叫 marshal)成功返回一个[]byte,失败返回一个error
下面看具体的使用方法:
一个给定的结构体Message

type Message struct { Name string Body string Time int64 }

一个Message的实例

m := Message{"Alice","Hello",1294706395881547000}

使用Marshal函数

b,err := json.Marshal(m)

如果成功了,将会返回一个包含json数据的[]byte

b ==[]byte(`{"Name":"Alice","Body":"Hello","Time":1294706395881547000}`)

json 解析相关的 struct tag

还是以Messagestruct为例

type Message struct { Name string Body string Time int64 }

正常情况下,我Message类型的数据被encode后生成的json字符串为:

{
  Name: "Alice",Body: "Hello",Time: 1294706395881547000,}

假如我想让Name换成小写name,或者其他的字段,例如username,我就可以加上struct tag:(以username为例)

type Message struct { Name string `json:"username"` Body string Time int64 }

这样,Marshal后得到的[]byte强制转化成string后就会显示为:

{
  username: "Alice",}

decode

类似于php json_decode的函数在这里为Unmarshal函数

func Unmarshal(data []byte,v interface{}) error

php的json_decode函数接受一个字符串,返回一个变量(或者是object或者是array),如果返回一个null则证明不可以decode。
Golang则不同,接收一个[]byte类型的数据,赋值到另外一个参数v上,如果不能decode,则返回一个error
下面使用的时候可以照抄:

var m Message

b为上面encode例子中的[]byte类型的变量,

err := json.Unmarshal(b,&m)

然后m的值为:

m = Message{
      Name: "Alice",Body: "Hello",Time: 1294706395881547000,}

不知要解析的[]byte为何种结构体的情况如何处理

有时候,我们不知道Unmarshal的比特数组为何种结构,这种情况下该如何取值呢?
其实也很简单,我们可以定义一个map

var m map[string]interface{}

然后执行Unmarshal

err := json.Unmarshal(b,&m)

这样就可以得到一个包含所有字段的map
然后对map中的值做类型判定,得出数值

if str,ok := m["Name"].(string); ok{
    name = str
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读