首页 文章

使用Gobson / Mgo解组BSON数据

提问于
浏览
3

我收到了不同的BSON文件,这里有一个例子:

{ "group" : { "id": ObjectId("11a123456bc345d452d32c0b5"), "name": "SomeName" }, "count1": 6, "count2": 33, "totalCount": 39 }

我正在尝试使用mgo / gobson将此数据解组为map [string] interface {},但不断出现错误 . 解组代码是

var record map[string]interface{}

err := bson.Unmarshal(data, &record)

这导致错误说文档已损坏 . 查看代码,我看到它期望字节数组的长度是前几个字节,所以我添加了类似于测试中找到的代码 .

rec := make([]byte, len(data)+6)
binary.LittleEndian.PutUint32(rec, uint32(len(rec)))
copy(rec[4:], data)

这让我经历了腐败的文件错误,但现在我得到了

Unknown element kind (0x7B)

我做错了什么,我不能轻易地将上述BSON文档解组成 Map ? BSON文件本身有问题吗?我不是BSON文件的创建者,但如果有必要,我可以向他们提供反馈 .

1 回答

  • 2

    我尝试了上面的代码,并设法让它“工作” . 你得到的原因

    Unknown element kind (0x7B)
    

    是因为BSON规范中没有 0x7B 类的元素 . 见这里http://bsonspec.org/spec.html . 我得到的特定unknow元素是文档中第一个大括号({)的字节值

    { "group" : { "id": ObjectId("11a123456bc345d452d32c0b5"), "name": "SomeName" }, "count1": 6, "count2": 33, "totalCount": 39 }
    

    在稍微调整一下代码后,我能够解决 unknown kind 错误 .

    package main
    
    import (
        "encoding/binary"
        "fmt"
    
        "gopkg.in/mgo.v2/bson"
    )
    
    func main() {
        bsonData := `{ "group" : { "id": ObjectId("11a123456bc345d452d32c0b5"), "name": "SomeName" }, "count1": 6, "count2": 33, "totalCount": 39 }`
    
        var record map[string]interface{}
    
        rec := make([]byte, len(bsonData)+6)
        binary.LittleEndian.PutUint32(rec, uint32(len(rec)))
        copy(rec[4:], bsonData)
        //Adding a new line to the front of the rec byte variable seems to do the trick
        r := []byte("\n")
        rec[4] = r[0]
        err := bson.Unmarshal(rec, &record)
        if err != nil {
            panic(err)
        }
        fmt.Println(record)
    }
    

    我也发现这个答案很有用https://stackoverflow.com/a/33129119/2627768

相关问题