1. 程式人生 > 其它 >golang map 儲存json檔案_Go語言操作json的技巧

golang map 儲存json檔案_Go語言操作json的技巧

技術標籤:golang map 儲存json檔案

cbfce9a2062e915ce6a97ba468c70986.png

本篇文章將會介紹我們平時在開發中會遇到的那些關於Golang操作json資料的技巧,主要是與結構體的一些轉換。

json的基本序列化

Go語言中的序列號直接呼叫json.Marshal()即可與和反序列化呼叫json.Unmarshal即可,方法相對來說比較簡單。

type Person struct {
Name string
Age int64
Weight float64
}

func main() {
p1 := Person{
Name: "七米",
Age: 18,
Weight: 71.5,
}
// struct -> json string
b, err := json.Marshal(p1)
if err != nil {
fmt.Printf("json.Marshal failed, err:%v\n", err)
return
}
fmt.Printf("str:%s\n", b)
// json string -> struct
var p2 Person
err = json.Unmarshal(b, &p2)
if err != nil {
fmt.Printf("json.Unmarshal failed, err:%v\n", err)
return
}
fmt.Printf("p2:%#v\n", p2)
}

輸出:

str:{"Name":"七米","Age":18,"Weight":71.5}
p2:main.Person{Name:"七米", Age:18, Weight:71.5}

json與結構體標籤tag

Tag標籤是結構體的元資訊,一般是在執行的時候通過反射的機制來讀取出來。Tag通常是在結構體欄位的後方定義,用反引號包闊起來,其格式如下:

`key1:"value1" key2:"value2"`

結構體 標籤 可以有多個鍵值對組成。鍵與值使用冒號分隔,值用雙引號括起來。

json標籤tag指定欄位名

json的序列化與反序列化預設情況下會使用結構體的欄位名,可以通過給結構體欄位新增tag來指定json序列化生成的欄位名。

// 使用json tag指定序列化與反序列化時的行為
type Person struct {
Name string `json:"name"` // 指定json序列化/反序列化時使用小寫name
Age int64
Weight float64
}

json忽略欄位

通常用在tag中新增-忽略掉結構體中的某個欄位。

// 使用json tag指定json序列化與反序列化時的行為
type Person struct {
Name string `json:"name"` // 指定json序列化/反序列化時使用小寫name
Age int64
Weight float64 `json:"-"` // 指定json序列化/反序列化時忽略此欄位
}

使用優雅方式處理字串格式的數字

有時候,前端在傳遞來的json資料中可能會使用字串型別的數字,這個時候可以在結構體tag中新增string來告訴json包從字串中解析相應欄位的資料:

type Card struct {
ID int64 `json:"id,string"` // 新增string tag
Score float64 `json:"score,string"` // 新增string tag
}

func intAndStringDemo() {
jsonStr1 := `{"id": "1234567","score": "88.50"}`
var c1 Card
if err := json.Unmarshal([]byte(jsonStr1), &c1); err != nil {
fmt.Printf("json.Unmarsha jsonStr1 failed, err:%v\n", err)
return
}
fmt.Printf("c1:%#v\n", c1) // c1:main.Card{ID:1234567, Score:88.5}
}

不確定層級的json格式處理

在平時開發中可以使用json.RawMessage來儲存原始位元組資料,從而解決在沒有固定的格式導致不好定義與其相對應的結構體的問題。

type sendMsg struct {
User string `json:"user"`
Msg string `json:"msg"`
}

func rawMessageDemo() {
jsonStr := `{"sendMsg":{"user":"q1mi","msg":"永遠不要高估自己"},"say":"Hello"}`
// 定義一個map,value型別為json.RawMessage,方便後續更靈活地處理
var data map[string]json.RawMessage
if err := json.Unmarshal([]byte(jsonStr), &data); err != nil {
fmt.Printf("json.Unmarshal jsonStr failed, err:%v\n", err)
return
}
var msg sendMsg
if err := json.Unmarshal(data["sendMsg"], &msg); err != nil {
fmt.Printf("json.Unmarshal failed, err:%v\n", err)
return
}
fmt.Printf("msg:%#v\n", msg)
// msg:main.sendMsg{User:"q1mi", Msg:"永遠不要高估自己"}
}

以上是關於Go語言操作json的介紹,感謝您的閱讀,如有疑問或意見請及時反饋給我們。


上一篇文章:

資料庫之分庫分表的一些總結