1. 程式人生 > 實用技巧 >Golang結構體與JSON相互轉換時的小技巧

Golang結構體與JSON相互轉換時的小技巧

簡單的例子

  實際中有一個Adset的結構體定義如下:

type Adset struct{
  Cost int64 `json:"cost"` 
  Name string `json:"name"`
  msg string // 小寫的不會被json解析
}

  建立一個Adset結構體並序列化如下:

package main

import (
    "encoding/json"
    "fmt"
)

type Adset struct{
    Cost float64 `json:"cost"`
    Name string `json:"name"`
    msg 
string // 小寫的不會被json解析 } func main() { // 定義一個結構體初始化 stucent := Adset{123.33,"天馬星空","666"} // 將結構體轉成json格式 data, err := json.Marshal(stucent) if err == nil{ fmt.Printf("%s\n",data)//{"cost":123.33,"name":"天馬星空"} } }

實際中的問題

  在實際中,雖然我們將結構體的cost欄位定義成了float64型別的,但是在與前端互動的時候(或者通過RPC呼叫獲取別的渠道的資料的時候),有可能別人傳過來的是一個字串型別的資料,這時候我門需要使用strconv模組將字串型別轉成float型別再進行自己邏輯的處理。

  本文介紹一下另外一種做法。

解決方案

  在定義結構體的時候,直接這樣做就好了:

package main

import (
    "encoding/json"
    "fmt"
)

type Adset struct{
    Cost float64 `json:"cost,string"` // 將cost欄位解析為string型別的資料
    Name string `json:"name"`
    msg string // 小寫的不會被json解析
}

func main() {
    // 定義一個結構體切片初始化
    stucent := Adset{123.33
,"天馬星空","666"} // 將結構體轉成json格式 data, err := json.Marshal(stucent) if err == nil{ // 注意這裡將 Id轉換為了string fmt.Printf("%s\n",data)//{"cost":"123.33","name":"天馬星空"} } // 特別注意反序列化的寫法!!// json反序列化為結構體 這裡的cost是 字串型別的。。。 s := `{"name":"天馬星空","cost":"123.3321"}` var obj Adset if err := json.Unmarshal([]byte(s),&obj);err != nil{ fmt.Println("err>>",err) }else{ // 反序列化後 成了 float64 (,string 的作用) fmt.Printf("%T \n",obj.Cost)// float64 fmt.Printf("%v \n",obj)// {123.3321 天馬星空 } } }

~~~