我可以在mgo中使用json标签作为json标签吗?

时间:2015-11-11 02:46:00

标签: json go bson mgo

我在我的项目中使用thrift,thrift会生成如下代码:

type CvJdRelationInfo struct {
    JdId            string `thrift:"jdId,1" json:"jdId"`
    CvId            string `thrift:"cvId,2" json:"cvId"`
    Status          int16  `thrift:"status,3" json:"status"`
    AcceptTimestamp int64  `thrift:"acceptTimestamp,4" json:"acceptTimestamp"`
}

正如您所见,节俭已生成json tags(但no bson tags),当我使用mgo保存记录时,mgo会自动转换:

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

我需要的是:

type CvJdRelationInfo struct {
    JdId            string `thrift:"jdId,1" json:"jdId" bson:"jdId"`
    CvId            string `thrift:"cvId,2" json:"cvId" bson:"cvId"`
    Status          int16  `thrift:"status,3" json:"status" bson:"status"`
    AcceptTimestamp int64  `thrift:"acceptTimestamp,4" json:"acceptTimestamp" bson:"acceptTimestamp"`
}

您可以看到,bson tagsjson tags相同。我可以将json tags用作bson tags吗?

2 个答案:

答案 0 :(得分:1)

MongoDB实际上将数据存储为二进制JSON(bson),这与JSON不同。这有点令人困惑,因为如果使用mongo shell访问数据库,则会返回原始JSON,但它实际上是转换,它不是存储格式。因此,在将数据存储到数据库时," mgo"驱动程序序列化为 bson

此序列化忽略json导出键,并通过默认为struct字段的小写版本来选择适当的名称。 (请参阅bson.Marshal go doc。)如果指定了bson导出密钥,它将忽略结构字段名称,并使用您指定为bson导出密钥的任何内容。

例如,

type User struct {
    Name string
    UserAge int `bson:"age"`
    Phone string `json:"phoneNumber"`
}

将在MongoDB中产生以下结构:

{
    "name": "",
    "age": 0,
    "phone": ""
}

所以看起来你的struct字段应该为你处理大多数事情。

一个人的问题'如果您没有指定bson导出密钥,那么您可能看不到它,如果您没有指定bson:",omitempty"导出密钥,则您无法通过bson:",inline"留下空白字段,或type Employee struct { User `bson:",inline"` JobTitle string EmployeeId string Salary int } 用于编组嵌入(或嵌套)结构。

例如,这就是处理嵌入式结构的方法:

{{1}}

我在bson.Marshal上提供的链接中指定了这些类型的东西。希望有所帮助!

答案 1 :(得分:0)

您可以使用以下内容(来自旧版测试文件git.apache.org/thrift.git/lib/go/test/GoTagTest.thrift)

struct tagged {
    1: string string_thing,
    2: i64 int_thing (go.tag = "json:\"int_thing,string\""),
    3: optional i64 optional_int_thing
}