zoukankan      html  css  js  c++  java
  • 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 天马星空 }
        }
    }

    ~~~

  • 相关阅读:
    第一阶段冲刺第五天
    第一阶段冲刺第四天
    构建之法阅读笔记03
    第一阶段冲刺第三天
    第一阶段冲刺第二天
    第十一周进度
    第一阶段意见评论
    第十周进度
    第九周进度
    人月神话阅读笔记03
  • 原文地址:https://www.cnblogs.com/paulwhw/p/14050240.html
Copyright © 2011-2022 走看看