将mongo条目解析为struct

时间:2015-08-10 09:21:05

标签: json mongodb go tags mgo

我有以下架构的mongo数据库

{ 
  "_id" : ObjectId("55c8526d8c16598efb5ee1e6"), 
  "guid" : "72811d52b48379e72c8fdd11aa09cb8b", 
  "blkid" : 1, 
  "vblkid" : 0, 
  "spltid" : 0, 
  "cmpr" : false, 
  "encr" : false,
  "chksum" : "",
  "dup" : false,
  "cid" : 1,
  "off" : 524508,
  "len" : 524408,
  "incr" : 0,
  "fBackupID" : 0,
  "vid" : 0,
  "plugInType" : 0, 
  "blkType" : 0, 
  "alen" : 0 
}

我试图将这些解析为具有以下结构的结构:

type VhfsBlockMD struct {
    GUID       string `json:"guid"`
    BlkID      int    `bson:",minsize" json:"blkid"`
    VBlkID     int    `bson:",minsize" json:"vblkid"`
    SpltID     int    `bson:",minsize" json:"spltid"`
    Cmpr       bool   `json:"cmpr" `
    Encr       bool   `json:"encr"`
    Blksum     string `bson:"blksum,omitempty" json:"blksum,omitempty"`
    Chksum     string `json:"chksum"`
    Dup        bool   `json:"dup"`
    Cid        int    `bson:",minsize" json:"cid"`
    SplitLen   int    `bson:",minsize" json:"len"`
    Off        int64  `bson:",minsize" json:"off"`
    Incr       int    `bson:",minsize" json:"incr"`
    CDup       bool   `bson:"cdup,omitempty" json:"cdup,omitempty"`
    FBackupID  int    `bson:"fBackupID" json:"fBackupID"`
    Vid        int    `bson:"vid" json:"vid"`
    PlugInType int    `bson:"plugInType" json:"plugInType"`
    BlkType    int    `bson:"blkType" json:"blkType"`
    Alen       int    `bson:"alen" json:"alen"`
    IsValid    int    `bson:"-" json:"-"`
    Len        uint64 `bson:"-" json:"-"`
}

我正在使用mgo驱动程序。

现在问题是解析后只有属性我无法正确解析是“len”(在go结构中的SplitLen)。

len定义为

SplitLen int `bson:",minsize" json:"len"`

我认为它与标签有关。另外我想提一下,使用相同的结构将值插入mongodb。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

如果数据元素出现在另一个表示中的不同名称下(例如json文本或数据库),而不是结构字段名称,则必须告诉与字段标记中的struct字段匹配的名称。

您告诉json软件包将json值"len"设置到字段SplitLen中,该字段的名称不同,方法是将其包含在其标记中:json:"len"。< / p>

但是你还没有告诉mongo驱动程序也使用这个很可能在你的mongodb中命名为"Len"(或"len")的字段。您明确排除了可以&#34;自动匹配的字段&#34;按名称:

Len uint64 `bson:"-" json:"-"`

正如Ainar-G建议的那样,您可以通过将"len"添加到bson标记值来指定字段,这将迫使mgo驱动程序也使用SplitLen字段:

SplitLen int `bson:"len,minsize" json:"len"`

现在我没有看到Len字段的任何用途,您应该将其删除以避免混淆,或使用Len名称代替SplitLen

Len int `bson:"len,minsize" json:"len"`

答案 1 :(得分:1)

将字段名称添加到BSON标记:

SplitLen int `bson:"len,minsize" json:"len"

否则它似乎会与被忽略的Len字段冲突。