gpt4 book ai didi

json - Go JSON命名策略

转载 作者:IT王子 更新时间:2023-10-29 00:45:03 25 4
gpt4 key购买 nike

我是 Go 的新手,我正在探索将 go 用于我的一项微服务。我想知道 Go 将对象转换为 Json 并返回 Json 的方式。但不幸的是,我发现使用标签名称配置输出字段名称并不困难。

type MyStruct strust{
MyName string
}

将转换为json

{
"MyName" : "somestring"
}

但是我们正在遵循整个组织的整个 api 遵循 snake_case 的命名策略

{
"my_name" : "somestring"
}

在我的组织中被认为是有效的。

我开始在每个字段级别使用 json:"my_name,omitempty" 等标签。

我想知道有没有一种方法可以在全局项目级别配置它,这样我就不想在每个对象及其字段级别都关心它。

最佳答案

您可以尝试这样的操作:https://play.golang.org/p/Vn-8XH_jLp5

核心功能:

// SnakeCaseEncode snake_case's the given struct's field names.
func SnakeCaseEncode(i interface{}) map[string]interface{} {
rt, rv := reflect.TypeOf(i), reflect.ValueOf(i)

if rt.Kind() == reflect.Ptr {
i := reflect.Indirect(rv).Interface()
rt, rv = reflect.TypeOf(i), reflect.ValueOf(i)
}

out := make(map[string]interface{}, rt.NumField())

for i := 0; i < rt.NumField(); i++ {
if rt.Field(i).Tag.Get("json") == "-" {
continue
}

if strings.Contains(rt.Field(i).Tag.Get("json"), "omitempty") &&
rv.Field(i).IsZero() { // Go 1.13
continue
}

k := snakeCase(rt.Field(i).Name)

out[k] = rv.Field(i).Interface()
}

return out
}

// snakeCase provides basic ASCII conversion of camelCase field names to snake_case.
func snakeCase(s string) string {
out := make([]rune, 0, utf8.RuneCountInString(s))

for i, r := range s {
if r >= 'A' && r <= 'Z' {
r += 32

if i > 0 {
out = append(out, '_')
}
}

out = append(out, r)
}

return string(out)
}

要支持 map 、 slice 等,您必须扩展这个简单版本。

关于json - Go JSON命名策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38651374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com