標籤:訪問 port 沒有 lang family tag ack 類型 map
1. golang 中 json 轉 struct
<1. 使用 json.Unmarshal 時,結構體的每一項必須是匯出項(import field)。也就是說結構體的 key 對應的首字母必須為大寫。請看下面的例子:
package commontestimport ( "testing" "encoding/json")type Person struct { name string age int}func TestStruct2Json(t *testing.T) { jsonStr := ` { "name":"liangyongxing", "age":12 } ` var person Person json.Unmarshal([]byte(jsonStr), &person) t.Log(person)}
輸出的結果如下:
{ 0}
從結果可以看出,json 資料並沒有寫入 Person 結構體中。結構體 key 首字母大寫的話就可以,修改後:
package commontestimport ( "testing" "encoding/json")type Person struct { Name string Age int}func TestStruct2Json(t *testing.T) { jsonStr := ` { "name":"liangyongxing", "age":12 } ` var person Person json.Unmarshal([]byte(jsonStr), &person) t.Log(person)}
列印結果如下:
{liangyongxing 12}
從以上結果我們可以發現一個很重要的資訊,json 裡面的 key 和 struct 裡面的 key 一個是小寫一個是大寫,即兩者大小寫並沒有對上。從這裡我們就可以得出一個結論,要想能夠附上值需要結構體中的變數名首字母大寫,而在轉換的 json 串中大小寫都可以,即在 json 傳中欄位名稱大小寫不敏感。那麼經過驗證發現,在 json 中如果寫成如下方式:
jsonStr := ` { "NaMe":"liangyongxing", "agE":12 } `
最終結果仍然是有值的,那麼就驗證了我們上面的結論,json 串中對欄位名大小寫不敏感(不一定是首字母,這點需要注意)
<2. 在結構體中是可以引入 tag 標籤的,這樣在匹配的時候 json 串對應的欄位名需要與 tag 標籤中定義的欄位名匹配,當然在 tag 中定義的名稱就不需要首字母大寫了,且對應的 json 串中欄位名稱仍然大小寫不敏感,和上面的結論一致。(注意:此時結構體中對應的欄位名可以不用和匹配的一致,但是也必須首字母大寫,只有大寫的才是可對外提供訪問的)
package commontestimport ( "testing" "encoding/json")//這裡對應的 N 和 A 不能為小寫,首字母必須為大寫,這樣才可對外提供訪問,具體 json 匹配是通過後面的 tag 標籤進行匹配的,與 N 和 A 沒有關係//tag 標籤中 json 後面跟著的是欄位名稱,都是字串類型,要求必須加上雙引號,否則 golang 是無法識別它的類型type Person struct { N string `json:"name"` A int `json:"age"`}func TestStruct2Json(t *testing.T) { jsonStr := ` { "name":"liangyongxing", "age":12 } ` var person Person json.Unmarshal([]byte(jsonStr), &person) t.Log(person)}
這樣輸出的結果如下:
{liangyongxing 12}
當然,你也可以再做一個實驗,驗證 tag 標籤中對應的欄位名稱大小寫不敏感,這裡就不做冗餘介紹了。
2. golang 中 struct 轉 json 串
持續總結中
Go_14:GoLang中 json、map、struct 之間的相互轉化