一.go語言 struct json相互轉換


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)
}

  

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM