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
",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
",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 
",obj.Cost)// float64
        fmt.Printf("%v 
",obj)// {123.3321 天马星空 }
    }
}

~~~

原文地址:https://www.cnblogs.com/paulwhw/p/14050240.html