【问题标题】:How to change default action of golang tags?如何更改 golang 标签的默认操作?
【发布时间】:2016-02-12 03:19:21
【问题描述】:

我不熟悉golang tags的用法,我想更改转换的默认动作:

type CvJdRelationInfo struct {
    JdId            string
    CvId            string
    Status          int16
    AcceptTimestamp int64
}

json 标签会自动转换:

JdId -> JdId
CvId -> CvId
Status -> Status
AcceptTimestamp -> AcceptTimestamp

bson 标签会自动转换:

JdId -> jdid
CvId -> cvid
Status -> status
AcceptTimestamp -> accepttimestamp

我可以更改默认操作,例如jsonbson标签会这样做:

JdId -> jdId
CvId -> cvId
Status -> status
AcceptTimestamp -> acceptTimeStamp

所以我每次都可以省略所有标签(如果默认操作正是我想要的,为什么我每次都要写标签?)

type CvJdRelationInfo struct {
    JdId            string `json:"jdId" bson:"jdId"`
    CvId            string `json:"cvId" bson:"cvId"`
    Status          int16  `json:"status" bson:"status"`
    AcceptTimestamp int64  `json:"acceptTimestamp" bson:"acceptTimestamp"`
}

【问题讨论】:

    标签: json go tags bson


    【解决方案1】:

    你可以试试:

       type CvJdRelationInfo struct {
         JdId            string    `bson:"jdId" json:"jdId"`
         CvId            string    `bson:"cvId" json:"cvId"`
         Status          int16     `bson:"status" json"status"`
         AcceptTimestamp int64     `bson:"acceptTimeStamp" json:"acceptTimeStamp"`
       }
    

    【讨论】:

    • 无论如何,我知道这一点,但我每次定义结构时都需要这样做,我想要做的是不附加标签,默认操作对我有用
    【解决方案2】:

    您无法更改 encoding/json 包的默认行为。它是内置的,没有导出的变量或函数会改变它。没什么好讨论的。

    对象的默认键字符串是结构字段名称,但可以在结构字段的标记值中指定。

    这里需要注意的一点是,即使将值编组到 JSON 将使用导出的大写名称,但是当您解组时,json 包“智能”足以将小写名称匹配到大写字段名称。

    看这个例子:

    s := struct{ X, Y int }{}
    if err := json.Unmarshal([]byte(`{"X":1,"y":2}`), &s); err != nil {
        panic(err)
    }
    fmt.Printf("%+v", s)
    

    它将打印 (Go Playground):

    {X:1 Y:2}
    

    json 包将 "X""y" 键与 s.Xs.Y 字段正确匹配,即使 "y" 是小写的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-01
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      相关资源
      最近更新 更多