Rumah > Artikel > pembangunan bahagian belakang > Ajar anda cara menggunakan Json dalam Go
Artikel ini ditulis oleh ruangan tutorial golang untuk memperkenalkan cara menggunakan Json dalam bahasa Go. Saya harap ia dapat membantu rakan yang memerlukan.
Enkod
mengekod objek ke dalam data JSON
, menerima objek interface{}
dan mengembalikan []byte
dan error
:
func Marshal(v interface{}) ([]byte, error)
Marshal
Fungsi akan melintasi keseluruhan objek secara rekursif dan mengekod objek mengikut jenis ahli secara bergilir-gilir Peraturan penukaran jenis adalah seperti berikut:
Penukaran jenis kepada bool
JSON
Boolean
JSON
Number
ditukar menjadi rentetan string
(dengan petikan "") JSON
ditukar menjadi struct
daripada JSON
, dan kemudian secara rekursif mengikut jenis setiap ahli Dikemas Object
akan JSON
dikodkan dahulu dan kemudian ditukar kepada Array
rentetan
[]byte
ditukar kepada base64
daripada JSON
,
map
JSON
Object
ditukar mengikut jenis dalaman sebenar key
string
's interface{}
nil
, JSON
dan jenis lain akan kembalikan null
channel
func
UnsupportedTypeError
type ColorGroup struct { ID int Name string Colors []string } group := ColorGroup{ ID: 1, Name: "Reds", Colors: []string{"Crimson", "Red", "Ruby", "Maroon"}, } b, err := json.Marshal(group) if err != nil { fmt.Println("error:", err) } os.Stdout.Write(b) Output: {"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]}menyahkod data
Peraturan penukaran jenis adalah serupa dengan peraturan di atas
JSON
func Unmarshal(data []byte, v interface{}) errorStruktur
var jsonBlob = []byte(`[ {"Name": "Platypus", "Order": "Monotremata"}, {"Name": "Quoll", "Order": "Dasyuromorphia"} ]`) type Animal struct { Name string Order string } var animals []Animal err := json.Unmarshal(jsonBlob, &animals) if err != nil { fmt.Println("error:", err) } fmt.Printf("%+v", animals) Output: [{Name:Platypus Order:Monotremata} {Name:Quoll Order:Dasyuromorphia}]Struktur mestilah Hanya ahli yang bermula dengan modal surat akan diproses oleh
, ahli yang bermula dengan huruf kecil tidak akan terjejas. Apabila , nama pembolehubah ahli struktur akan dibungkus terus ke dalam sebagai
daripada JSON
, apabila
Mashal
JSON
, jika terdapat medan berlebihan dalam Object
, ia akan dibuang terus; jika key
tiada medan, memberikan nilai kepada pembolehubah dalam struktur akan diabaikan dan tiada ralat akan dilaporkan. JSON
Unmashal
Unmarshal
JSON
StructTagJSON
type Message struct { Name string Body string Time int64 inner string } var m = Message{ Name: "Alice", Body: "Hello", Time: 1294706395881547000, inner: "ok", } b := []byte(`{"nAmE":"Bob","Food":"Pickle", "inner":"changed"}`) err := json.Unmarshal(b, &m) if err != nil { fmt.Printf(err.Error()) return} fmt.Printf("%v", m) Output: {Bob Hello 1294706395881547000 ok}Jika anda ingin mengkonfigurasi perhubungan yang sepadan secara manual antara ahli struktur dan medan
, anda boleh mentakrifkan struktur Apabila menandai ahli: Gunakan untuk membiasakan diri dengannya Jika medan adalah atau nilai 0 (nombor 0, rentetan "", tatasusunan kosong [], dsb. ), maka yang dibungkus
Hasilnya tidak akan mempunyai medan ini.JSON
omitempty
nil
JSON
type Message struct { Name string `json:"msg_name"` // 对应JSON的msg_name Body string `json:"body,omitempty"` // 如果为空置则忽略字段 Time int64 `json:"-"` // 直接忽略字段 } var m = Message{ Name: "Alice", Body: "", Time: 1294706395881547000, } data, err := json.Marshal(m) if err != nil { fmt.Printf(err.Error()) return} fmt.Println(string(data)) Output: {"msg_name":"Alice"}Gunakan json.RawMessage
JSON
Malah, ia adalahTaip takrifan semula. Casting adalah mungkin. Kini terdapat senario di mana format salah satu medan dalam struktur tidak diketahui:
Jika anda menggunakan json.RawMessage
, medan []byte
berada dalam
. Kami mungkin membongkar lapisan pertama
data dahulu, dan kemudian menentukan jenis khusustype Command struct { ID int Cmd string Args *json.RawMessage }berdasarkan nilai
untuk json.RawMessage
kedua. Args
Unmarshal
Apa yang perlu diperhatikan di sini ialah jenis penunjuk Args
mesti digunakan, jika tidak, JSON
akan dianggap sebagai jenis Cmd
dan akan dibungkus ke dalam rentetan Args
yang dikodkan semasa pembungkusan . Unmarshal
*json.RawMessage
Args
Menggunakan antara muka{}[]byte
base64
jenis dalam , akan ditukar secara automatik kepada jenis data yang sepadan :
Ada dua perkara yang perlu diperhatikan. Salah satunya ialah semua nilai ditukar secara automatik kepada jenis interface{}
dan anda perlu menukarnya secara manual kepada jenis Unmarshal
, JSON
dan lain-lain yang diperlukan apabila menggunakannya. Yang kedua ialah
JSON的boolean 转换为boolJSON的数值 转换为float64JSON的字符串 转换为stringJSON的Array 转换为[]interface{}JSON的Object 转换为map[string]interface{}JSON的null 转换为nilditukar secara automatik kepada jenis
dan nama medan JSON
digunakan terus sebagai float64
untuk akses. Apabila anda tidak tahu format int
data, anda boleh menggunakan int64
. JSON
自定义类型
如果希望自己定义对象的打包解包方式,可以实现以下的接口:
type Marshaler interface { MarshalJSON() ([]byte, error) } type Unmarshaler interface { UnmarshalJSON([]byte) error }
实现该接口的对象需要将自己的数据打包和解包。如果实现了该接口,json
在打包解包时则会调用自定义的方法,不再对该对象进行其他处理。
Atas ialah kandungan terperinci Ajar anda cara menggunakan Json dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!