作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我收到了不同的 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 文档的创建者,但可以在必要时向他们提供反馈。
最佳答案
我试过你上面的代码,我设法让它“工作”。你得到的原因
Unknown element kind (0x7B)
是因为BSON规范中没有0x7B
类型的元素。在这里看到 http://bsonspec.org/spec.html 。我得到的特定未知元素是文档中第一个大括号 ({) 的字节值
{ "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
关于mongodb - 使用 Gobson/Mgo 解码 BSON 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39130567/
我收到了不同的 BSON 文档,这里是一个示例: { "group" : { "id": ObjectId("11a123456bc345d452d32c0b5"), "name": "SomeNam
我是一名优秀的程序员,十分优秀!