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 天馬星空 }
    }
}

~~~


免責聲明!

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



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