golang 如何将interface{}数据转化为int型?

心雨秀 2019-09-11 04:42:42
我这里需要将interface{}型转化为int型,这个interface{}是通过json.Unmarshal解析过来的,不确定json中interface{}对应的实际会是数字字符串,还是数字型,另外,json.Unmarshal转换后的interface{}中数字类型默认都是float64型。
我该怎么判断interface{}实际对应的类型,并将其转换成int型呢?

如原有json数据为{"first":"1","second":2,"third":"3.33"},转换后的数据为{"first":1,"second":2,"third":3}

哪位朋友能帮帮忙,先谢谢大家了!
...全文
3014 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
零叶小舟 2019-11-29
  • 打赏
  • 举报
回复
用反射转换: var a interface{} reflect.valueof(a).int64() 好像是int方法来,你查一下文档
心雨秀 2019-09-12
  • 打赏
  • 举报
回复
引用 1 楼 qybao 的回复:
你这种设计模式不好,接口数据不统一,应该规范数据接口,大家遵守
既然已经这样了,你只能做些转换处理了,比如

import (
"fmt"
"encoding/json"
"strconv"
)

type SampleJson struct { //json结构体
First interface{} `json:"first"`
Second interface{} `json:"second"`
Third interface{} `json:"third"`
}

func (p *SampleJson) Format() { //类型转换
elem := reflect.ValueOf(p).Elem()
for i := 0; i < elem.NumField(); i++ {
v := 0
switch elem.Field(i).Interface().(type) {
case string:
n, _ := strconv.ParseFloat(elem.Field(i).Interface().(string), 64)
v = int(n)
case float64:
v = int(elem.Field(i).Interface().(float64))
default:
}
elem.Field(i).Set(reflect.ValueOf(v)) //转换后重新修改值
}
}

func main() {
s := `{"first":"1","second":2,"third":"3.33"}`
p := &SampleJson{}
json.Unmarshal([]byte(s), p)
p.Format() //转换
fmt.Println(p)
b, _ := json.Marshal(p)
fmt.Println(string(b))
n := p.First.(int)
fmt.Println(n)
}


验证可用,十分感谢!
qybao 2019-09-11
  • 打赏
  • 举报
回复
你这种设计模式不好,接口数据不统一,应该规范数据接口,大家遵守
既然已经这样了,你只能做些转换处理了,比如

import (
"fmt"
"encoding/json"
"strconv"
)

type SampleJson struct { //json结构体
First interface{} `json:"first"`
Second interface{} `json:"second"`
Third interface{} `json:"third"`
}

func (p *SampleJson) Format() { //类型转换
elem := reflect.ValueOf(p).Elem()
for i := 0; i < elem.NumField(); i++ {
v := 0
switch elem.Field(i).Interface().(type) {
case string:
n, _ := strconv.ParseFloat(elem.Field(i).Interface().(string), 64)
v = int(n)
case float64:
v = int(elem.Field(i).Interface().(float64))
default:
}
elem.Field(i).Set(reflect.ValueOf(v)) //转换后重新修改值
}
}

func main() {
s := `{"first":"1","second":2,"third":"3.33"}`
p := &SampleJson{}
json.Unmarshal([]byte(s), p)
p.Format() //转换
fmt.Println(p)
b, _ := json.Marshal(p)
fmt.Println(string(b))
n := p.First.(int)
fmt.Println(n)
}


2,348

社区成员

发帖
与我相关
我的任务
社区描述
go语言学习与交流版
社区管理员
  • go语言社区
  • 俺叫西西弗斯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧