首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Go JSON命名策略

Go JSON命名策略
EN

Stack Overflow用户
提问于 2016-07-29 13:50:39
回答 1查看 1.6K关注 0票数 4

我是Go的新手,我正在探索go来使用我的一项微服务。我想知道Go如何将对象转换为Json,然后再转换回Json。但不幸的是,我发现使用标记名配置输出字段名有点困难。

代码语言:javascript
运行
复制
type MyStruct strust{
   MyName string
}

将转换为json

代码语言:javascript
运行
复制
{
    "MyName" : "somestring"
}

但是,我们在整个组织中遵循了一个命名策略,以遵循snake_case

代码语言:javascript
运行
复制
{
        "my_name" : "somestring"
}

在我的组织中是有效的。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-29 15:24:15

您可以尝试如下所示:https://play.golang.org/p/Vn-8XH_jLp5

核心功能:

代码语言:javascript
运行
复制
// 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等,你必须在这个简单的版本上进行扩展。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38651374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档