Golang 的json處理

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",
  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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章