我想在Golang中将一个结构体转换为Map。如果我能在创建的Map中使用JSON标记作为键(否则默认为字段名),那就太好了。
编辑2020年12月14日
由于structs repo已存档,因此可以改用mapstructure。
编辑TL;DR版本,2015年6月15日
如果你想要一个将结构转换为Map的快速解决方案,请查看被接受的答案,投赞成票并使用该软件包。
快乐编码!:)
原始帖子
到目前为止我有这个功能,我使用的是reflect包,但是我不太明白如何使用这个包,请大家多多包涵。
func ConvertToMap(model interface{}) bson.M {
ret := bson.M{}
modelReflect := reflect.ValueOf(model)
if modelReflect.Kind() == reflect.Ptr {
modelReflect = modelReflect.Elem()
}
modelRefType := modelReflect.Type()
fieldsCount := modelReflect.NumField()
var fieldData interface{}
for i := 0; i < fieldsCount; i++ {
field := modelReflect.Field(i)
switch field.Kind() {
case reflect.Struct:
fallthrough
case reflect.Ptr:
fieldData = ConvertToMap(field.Interface())
default:
fieldData = field.Interface()
}
ret[modelRefType.Field(i).Name] = fieldData
}
return ret
}
我还看了JSON包的源代码,因为它应该包含我需要的实现(或部分),但不太理解。
7条答案
按热度按时间83qze16e1#
我也需要这样的东西。我使用了一个内部包,它将一个结构转换为一个Map。我决定将它与其他基于
struct
的高级函数一起开源。看看:https://github.com/fatih/structs
它支持:
[]string
[]values
您可以在这里看到一些示例:http://godoc.org/github.com/fatih/structs#pkg-examples例如,将一个结构体转换为Map很简单:
structs
包支持匿名(嵌入式)字段和嵌套结构。包提供了通过字段标签过滤某些字段。x3naxklr2#
从
struct
到map[string]interface{}
go playground here
hc8w905p3#
下面是我以前编写的一个函数,它使用标记作为键,将结构体转换为Map
可运行example here.
注意,如果你有多个字段有相同的标签值,那么你显然不能把它们都存储在一个Map中,如果发生这种情况,返回一个错误可能是谨慎的。
bbmckpt74#
我喜欢接受答案的可导入包,但它不翻译我的json别名。我的大多数项目都有一个我导入的helper函数/类。
这里有一个函数可以解决我的特定问题。
大体上,这就是它的名字...
czfnxgou5#
kmbjn2e36#
我有点晚了,但我需要这种特性,所以我写了这个。可以解析嵌套的结构。默认情况下,使用字段名,但也可以使用自定义标记。一个副作用是,如果你设置tagTitle常量为json,你可以使用你已经拥有的json标记。
8e2ybdfx7#