我正在开发将接收JSON的Web服务。Go转换类型太严格。
所以,我没有下面的函数转换interface{}
中bool
func toBool(i1 interface{}) bool {
if i1 == nil {
return false
}
switch i2 := i1.(type) {
default:
return false
case bool:
return i2
case string:
return i2 == "true"
case int:
return i2 != 0
case *bool:
if i2 == nil {
return false
}
return *i2
case *string:
if i2 == nil {
return false
}
return *i2 == "true"
case *int:
if i2 == nil {
return false
}
return *i2 != 0
}
return false
}
我认为,功能还不够完善,我需要的功能转换interface{}
中string
,int
,int64
,等
所以我的问题是:是否存在Go
将转换interface{}
为某些类型的库(函数集)
更新
我的Web服务接收JSON。我对它进行解码是因为map[string]interface{}
我无法控制对其进行编码的人员。
因此,我收到的所有值都是interface{}
,我需要将其强制转换为某些类型的方法。
因此,它可能是nil
,int
,float64
,string
,[...]
,{...}
,我想将它转换为它应该是什么。例如int
,float64
,string
,[]string
,map[string]string
与处理的所有可能的情况包括nil
,错误的价值观,等等
更新2
我收到{"s": "wow", "x":123,"y":true}
,{"s": 123, "x":"123","y":"true"}
,{a:["a123", "a234"]}
,{}
var m1 map[string]interface{}
json.Unmarshal(b, &m1)
s := toString(m1["s"])
x := toInt(m1["x"])
y := toBool(m1["y"])
arr := toStringArray(m1["a"])
objx软件包完全可以满足您的需求,它可以直接与JSON一起使用,并为您提供默认值和其他出色功能:
Objx提供了
objx.Map
一种类型,该类型提供了map[string]interface{}
一种强大的Get
方法(以及其他方法),使您可以轻松快速地访问地图中的数据,而不必担心类型断言,数据丢失,默认值等。
这是用法的一个小例子:
o := objx.New(m1)
s := o.Get("m1").Str()
x := o.Get("x").Int()
y := o.Get("y").Bool()
arr := objx.New(m1["a"])
来自使用JSON的文档示例:
// use MustFromJSON to make an objx.Map from some JSON
m := objx.MustFromJSON(`{"name": "Mat", "age": 30}`)
// get the details
name := m.Get("name").Str()
age := m.Get("age").Int()
// get their nickname (or use their name if they
// don't have one)
nickname := m.Get("nickname").Str(name)
显然,您可以在普通运行时中使用类似的方法:
switch record[field].(type) {
case int:
value = record[field].(int)
case float64:
value = record[field].(float64)
case string:
value = record[field].(string)
}
但是,如果您检查objx访问器,则可以看到类似于此的复杂代码,但是有很多用法,因此,我认为最好的解决方案是使用objx库。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句