Golang官网上有专门的包来处理json数据,https://golang.org/pkg/encoding/json/。
需要导入一个包@H_301_3@"encoding/json"
import "encoding/json"
和其他语言处理类似,分为encode和decode两部分
encode
类似于PHP @H_301_3@json_encode的函数在这里为@H_301_3@Marshal函数
func Marshal(v interface{}) ([]byte,error)
PHP的函数@H_301_3@json_encode是如果encode成功,返回一个string字符串,失败返回一个@H_301_3@false。
Golang和PHP类似,只不过是encode(这里叫 marshal)成功返回一个@H_301_3@[]byte,失败返回一个@H_301_3@error。
下面看具体的使用方法:
一个给定的结构体@H_301_3@Message
type Message struct { Name string Body string Time int64 }
一个@H_301_3@Message的实例
m := Message{"Alice","Hello",1294706395881547000}
b,err := json.Marshal(m)
如果成功了,将会返回一个包含json数据的@H_301_3@[]byte
b ==[]byte(`{"Name":"Alice","Body":"Hello","Time":1294706395881547000}`)
json 解析相关的 struct tag
还是以@H_301_3@Messagestruct为例
type Message struct { Name string Body string Time int64 }
正常情况下,我@H_301_3@Message类型的数据被encode后生成的json字符串为:
{ Name: "Alice",Body: "Hello",Time: 1294706395881547000,}
假如我想让@H_301_3@Name换成小写@H_301_3@name,或者其他的字段,例如@H_301_3@username,我就可以加上struct tag:(以@H_301_3@username为例)
type Message struct { Name string `json:"username"` Body string Time int64 }
这样,Marshal后得到的@H_301_3@[]byte强制转化成@H_301_3@string后就会显示为:
{ username: "Alice",}
decode
类似于PHP @H_301_3@json_decode的函数在这里为@H_301_3@Unmarshal函数
func Unmarshal(data []byte,v interface{}) error
PHP的@H_301_3@json_decode函数接受一个字符串,返回一个变量(或者是object或者是array),如果返回一个@H_301_3@null则证明不可以decode。
Golang则不同,接收一个@H_301_3@[]byte类型的数据,赋值到另外一个参数@H_301_3@v上,如果不能decode,则返回一个@H_301_3@error
下面使用的时候可以照抄:
var m Message
@H_301_3@b为上面encode例子中的@H_301_3@[]byte类型的变量,
err := json.Unmarshal(b,&m)
然后@H_301_3@m的值为:
m = Message{
Name: "Alice",Body: "Hello",Time: 1294706395881547000,}
不知要解析的@H_301_3@[]byte为何种结构体的情况如何处理
有时候,我们不知道@H_301_3@Unmarshal的比特数组为何种结构,这种情况下该如何取值呢?
其实也很简单,我们可以定义一个@H_301_3@map
var m map[string]interface{}
err := json.Unmarshal(b,&m)
这样就可以得到一个包含所有字段的@H_301_3@map了
然后对@H_301_3@map中的值做类型判定,得出数值
if str,ok := m["Name"].(string); ok{
name = str
}
@H_793_301@