golang 處理未確定json字符串

json字符串轉golang map

我們知道golang處理json字符串時,需要先轉成struct,並且struct必須是確定的。
有時候我們傳遞的json是不固定的,針對每種情況都寫一個struct比較麻煩,有沒有處理不確定json的方法呢?
答案是有的

	var a string = "{\"a\":1,\"b\":\"xx\"}"
	var b map[string]interface{}
	err := json.Unmarshal([]byte(a), &b)
	if err != nil {
		log.Println(err)
		return
	}

如上面的示例,a是一個json字符串,b就是用來接收json字符串的map,其key是string,value是interface。
這樣反序列化就可以把json字符串映射成一個golang的map,用起來與struct一樣。

判斷map中key是否存在

因爲json字符串是不確定的,所以我們會用到判斷某個key是否在map中,其方法如下

	if _, ok := b["a"]; ok {
		log.Println(b["a"])
	}

如果有a,ok是true;如果沒有a,ok是false。

判斷value類型

既然json字符串不固定,key確認是否存在了,還需要確認value的類型。

if reflect.TypeOf(b["a"]).Kind() == reflect.Float64 {
}

golang會把數字轉成float64,默認按照最大的存儲數字轉換,避免數據丟失。reflect.TypeOf用來獲取數據類型,獲取的是一個結構體,Kind函數獲取具體的類型。reflect.Float64是系統定義的類型,常見的類型都有,包括map,string等。

value數據轉換

通過b["a"]獲取的是interface,因爲本身我們的map就是interface。
賦值的時候可能會遇到類型轉換,比如把float64轉成int,如果直接用常見的int(b["a"])會報錯
需要先用b["a"].(float64)轉成對應的數據,再進行int(b["a"].(float64))轉換。
能否用b["a"].(int)直接轉換?答案是不可以。golang對類型限制的比較嚴,會報錯。
https://stackoverflow.com/questions/35583735/unmarshaling-into-an-interface-and-then-performing-type-assertion
https://pkg.go.dev/encoding/json#Unmarshal

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章