golang中的json
生活随笔
收集整理的這篇文章主要介紹了
golang中的json
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
編碼
結構體生成json
使用json.Marshal()函數可以對一組數據進行json格式的編碼.
json.Marshal()函數的聲明
還有一個格式化輸出
//MarshalIndent很像Marshal, 只是用縮進對輸出進行格式化 func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error)Marshal
//成員變量名首字母必須大寫 type IT struct {Company stringSubjects []stringIsOk boolPrice float64 }func main() {//定義一個結構體變量,同時初始化s := IT{"abc", []string{"go", "cpp", "test"}, true, 66.66}//編碼,根據內容生成json文本buf, err := json.Marshal(s)if err != nil {fmt.Println("err = ", err)return}//要轉成字符串//{"Company":"abc","Subjects":["go","cpp","test"],"IsOk":true,"Price":66.66}fmt.Println(string(buf)) }MarshalIndent
type IT struct {Company stringSubjects []stringIsOk boolPrice float64 }func main() {//定義一個結構體變量,同時初始化s := IT{"abc", []string{"go", "cpp", "test"}, true, 66.66}//編碼,第3個參數是縮進buf, err := json.MarshalIndent(s, "", " ")if err != nil {fmt.Println("err = ", err)return}//要轉成字符串fmt.Println(string(buf)) }二次編碼
Go 語言中數據結構和 JSON 類型的對應關系如下表
有些時候,我們在序列化或者反序列化的時候,可能結構體類型和需要的類型不一致,這個時候可以指定,支持string,number和boolean
//成員變量名首字母必須大寫 type IT struct {Company string `json:"company"` //改名字Subjects []string `json:"sub"`IsOk bool `json:",string"` //轉成字符串Price float64 `json:"-"` //這個不會輸出 }func main() {//定義一個結構體變量,同時初始化s := IT{"abc", []string{"go", "cpp", "test"}, true, 66.66}//編碼,根據內容生成json文本buf, err := json.Marshal(s)if err != nil {fmt.Println("err = ", err)return}//要轉成字符串//{"company":"abc","sub":["go","cpp","test"],"IsOk":"true"}fmt.Println(string(buf)) } `json:"-"`表示不進行序列化`
type Product struct {Name string `json:"name"`ProductID int64 `json:"-"` // 表示不進行序列化Number int `json:"number"`Price float64 `json:"price"`IsOnSale bool `json:"is_on_sale,string"` }// 序列化過后,可以看見{"name":"Xiao mi 6","number":10000,"price":2499,"is_on_sale":"false"}- omitempty:當字段為空(默認值)時,不要解析這個字段。比如 false、0、nil、長度為 0 的 array,map,slice,string
通過map生成json
func main() {//創建個mapm := make(map[string]interface{}, 4)m["company"] = "abc"m["sub"] = []string{"go", "c++", "test"}m["isok"] = truem["price"] = 6.66//編碼成jsonres, err:= json.MarshalIndent(m, "", " ")if err != nil {fmt.Println(err)return}fmt.Println(string(res)) }解析
解析到結構體
//成員變量名首字母必須大寫 type IT struct {Company string `json:"company"` //改名字Subjects []string `json:"sub"`IsOk bool `json:",string"` //轉成字符串Price float64 `json:"-"` //這個不會輸出 }func main() {jsonBuf := `{"company":"abc","sub":["go","cpp","test"],"IsOk":"true"}`var tmp IT//參數一要切片[]byte,第二個參數要地址傳遞res := json.Unmarshal([]byte(jsonBuf), &tmp)if res != nil {fmt.Println(res)return}fmt.Println(tmp)//詳細打印fmt.Printf("%+v\n", tmp) }解析到map
func main() {jsonBuf := `{"company":"abc","sub":["go","cpp","test"],"IsOk":"true"}`m := make(map[string]interface{}, 4)//參數一要切片[]byte,第二個參數要地址傳遞res := json.Unmarshal([]byte(jsonBuf), &m)if res != nil {fmt.Println(res)return}//詳細打印fmt.Printf("%+v\n", m) }類型斷言
因為字符串不能直接接收
和 stream 中 JSON 打交道
上面所有的 JSON 數據來源都是預先定義的[]byte緩存,在很多時候,如果能讀取/寫入其他地方的數據就好了。encoding/json庫中有兩個專門處理這個事情的結構:Decoder和Encoder:
// Decoder 從 r io.Reader 中讀取數據,`Decode(v interface{})` 方法把數據轉換成對應的數據結構 func NewDecoder(r io.Reader) *Decoder// Encoder 的 `Encode(v interface{})` 把數據結構轉換成對應的 JSON 數據,然后寫入到 w io.Writer 中 func NewEncoder(w io.Writer) *Encoder下面的例子就是從標準輸入流中讀取數據,解析成數據結構,刪除所有鍵不是Name的字段,然后再 encode 成 JSON 數據,打印到標準輸出。
package mainimport ("encoding/json""log""os" )func main() {dec := json.NewDecoder(os.Stdin)enc := json.NewEncoder(os.Stdout)for {var v map[string]interface{}if err := dec.Decode(&v); err != nil {log.Println(err)return}for k := range v {if k != "Name" {delete(v, k)}}if err := enc.Encode(&v); err != nil {log.Println(err)}} }反序列化的[]和nil
package mainimport ("encoding/json""log" )type JS struct {A []string }func main() {v1 := &JS{}v2 := &JS{A: []string{}}o1, err := json.Marshal(&v1)log.Println(string(o1), err)o2, err2 := json.Marshal(&v2)log.Println(string(o2), err2) }輸出
2019/01/07 18:13:26 {"A":null} <nil> 2019/01/07 18:13:26 {"A":[]} <nil>總結
以上是生活随笔為你收集整理的golang中的json的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: golang中的os包
- 下一篇: golang正则表达式