我可以将json标签用作mgo中的json标签吗?

I am using thrift in my project, thrift will generate code as follow:

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"`
}

as you see thrift already generate json tags(but no bson tags), when I use mgo save record, mgo will auto convert:

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

what I needed is:

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"`
}

as your can see, bson tags is the same as json tags. Can I use json tags as bson tags?

MongoDB actually stores the data as binary JSON (bson), which is distinct from JSON. It's slightly confusing because if you access the database using the mongo shell, you get back raw JSON, but it's actually a conversion, it's not the storage format. So in storing the data to the database, the "mgo" driver serializes as bson.

This serializing ignores the json export keys, and chooses the appropriate name by defaulting to the lowercase version of your struct field. (See the bson.Marshal go doc.) If you specify a bson export key, it will then ignore the struct field name and go with whatever you have specified as the bson export key.

For example,

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

will result in the following structure in MongoDB:

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

So it seems like your struct fields should handle most things for you.

The one 'gotcha' that you might not see until it bites you is, if you don't specify the bson export keys, you don't have the ability to do bson:",omitempty" for leaving out blank fields, or bson:",inline" for marshaling embedded (or nested) structs.

For instance, this is how you would handle embedded structs:

type Employee struct {
    User `bson:",inline"`
    JobTitle string
    EmployeeId string
    Salary int
}

These sorts of things are specified in that link I provided on bson.Marshal. Hope that helps!

You can use the following (From thrift test file 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
}