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
還是以Message
struct爲例
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",
Body: "Hello",
Time: 1294706395881547000,
}
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
}