1.Go語言自帶JSON轉換庫 encoding/json
2.把對象轉換為json的方法為 json.Marshal(),其函數原型為:
func Marshal(v interface{}) ([]byte, error) { e := newEncodeState() err := e.marshal(v, encOpts{escapeHTML: true}) if err != nil { return nil, err } buf := append([]byte(nil), e.Bytes()...) e.Reset() encodeStatePool.Put(e) return buf, nil }
1) 函數可以接收任意類型的數據 v,並轉換為字節數組類型,返回值就是json數據和錯誤代碼;若轉換成功,則err = nil;
2)在進行對象轉換為JSON的過程中,會遵循一下幾條原則:
1.布爾型轉換為JSON后仍然是布爾型;
2.浮點型轉換為JSON后里面的常規數字;
3.字符串將以UTF-8編碼轉化輸出為Unicode字符串,將特殊字符轉義;
4.數組和切片被轉換為JSON里面的數組,[]byte類會被轉換為base64編碼后的字符串,slice的零值被轉換為null;
5.結構體轉換為JSON對象,並且只有結構體內變量必須首字母大寫,才可被導出的字段轉化輸出,而且這些字段會被作為JSON對象的字符串索引;
6.轉換一個map類型的數據結構時,該數據的類型必須時map[string]T,T可以是encoding/json包支持的任意類型。
2.把JSON轉換回對象方法的方法為json.Unmarshal(),函數原型為:
func Unmarshal(data []byte, v interface{}) error { // Check for well-formedness. // Avoids filling out half a data structure // before discovering a JSON syntax error. var d decodeState err := checkValid(data, &d.scan) if err != nil { return err } d.init(data) return d.unmarshal(v) }
1)函數會把傳入的data作為一個JSON來進行解析,解析后的數據存儲在參數v中,這個參數可以是任意類型的參數(是一個類型的指針);
2)json.Umarshal()函數會根據一個約定的順序查找結構中的字段,如果找到一個即發生匹配。假設一個JSON對象有一個名為“Foo”的索引,要將“Foo”所對應的值填充到目標結構體的目標字段上,json.Umarshal()將會遵循如下順序進行查找匹配:
1.一個包含Foo標簽的字段;
2.一個名為Foo的字段
3.一個名為Foo或者除了首字母不區分大小寫的名為Foo的字段,這些字段在類型聲明中必須都是首字母大寫,可被導出字段。
注意:如果JSON中的字段在Go目標類型中不存在,json,Umarshal()函數在解碼過程中會丟棄該字段。
3)當JSON的結構位置時,會遵循一下規則:
1.JSON中的布爾型將會轉換為Go中的bool類型;
2.數值將會被轉換為Go的float64類型;
3.字符串轉換后是stirng類型;
4.JSON數組將會轉換為[]interface{}類型
5.JSON對象會被轉換為map[stirng]interface{}類型;
6.null值會轉換為nil
注意:在Go的標准庫中encoding/json包中,允許使用map[stirng]interface{}和interface{}類型來分別存儲結構中的JSON對象和JSON數組。
4.遇到問題,解決問題
1)接收JSON字符串后,將其轉換為結構體,JSON字符串中某一鍵值對,值類型為JSONArray,在結構體中聲明為string。在轉換之前將JSON中“properties”的值試圖轉換為string類型,使用json.Marshal(interface{})即可;也可在結構體中修改該變量類型為[]interface{},轉換成功。
{ "subjectId":"MathOperation", "subjectName":"數學運算", "subjectDispSerial":2, "subjectClass":"principal", "activityId":"Sum", "actDispSerial":1, "icon":"Sum.png", "modiTime":"2017-06-13 10:17:17", "funcGrp":"arithmetic", "author":"", "status":2, "properties":[ {"key":"nodeLabel","val":"","diapName":"節點標簽","editStyle":"TextField","dispSerial":10,"editable":true}, ] }
type Activity struct { Id int SubjectId string SubjectName string SubjectDispSerial int SubjectClass string ActivityId string ActivityName string ActDispSerial int Icon string ModiTime string FuncGrp string Author string Status int Properties []interface{} }
var act models.Activity if err := json.Unmarshal([]byte(data), &act); err == nil { fmt.Println(act.SubjectId) fmt.Println(act.ActivityId) fmt.Println(act.Properties) } else { fmt.Println(err) }