我所期待的相当于Document.parse()
golang中的,允许我直接从json创建bson?我不想为编组创建中间golang结构
答案 0 :(得分:11)
gopkg.in/mgo.v2/bson
软件包有一个名为UnmarshalJSON
的函数,可以完全按照您的要求执行。
data
参数应该将JSON字符串保存为[]byte
值。
func UnmarshalJSON(data []byte, value interface{}) error
UnmarshalJSON解组可能包含BSON扩展JSON规范中定义的非标准语法的JSON值。
示例:
var bdoc interface{}
err = bson.UnmarshalJSON([]byte(`{"id": 1,"name": "A green door","price": 12.50,"tags": ["home", "green"]}`),&bdoc)
if err != nil {
panic(err)
}
err = c.Insert(&bdoc)
if err != nil {
panic(err)
}
答案 1 :(得分:6)
mongo-go-driver
有一个函数 bson.UnmarshalExtJSON
来完成这项工作。
示例如下:
var doc interface{}
err := bson.UnmarshalExtJSON([]byte(`{"foo":"bar"}`), true, &doc)
if err != nil {
// handle error
}
答案 2 :(得分:1)
不再有办法直接使用受支持的库(例如 mongo-go-driver)来执行此操作。您需要根据 bson 规范编写自己的转换器。
答案 3 :(得分:0)
我不想为编组创建中间 Go 结构
如果您确实想要/需要创建中间 Go BSON 结构,您可以使用转换模块,例如 github.com/sindbach/json-to-bson-go。例如:
import (
"fmt"
"github.com/sindbach/json-to-bson-go/convert"
"github.com/sindbach/json-to-bson-go/options"
)
func main() {
doc := `{"foo": "buildfest", "bar": {"$numberDecimal":"2021"} }`
opt := options.NewOptions()
result, _ := convert.Convert([]byte(doc), opt)
fmt.Println(result)
}
将产生输出:
package main
import "go.mongodb.org/mongo-driver/bson/primitive"
type Example struct {
Foo string `bson:"foo"`
Bar primitive.Decimal128 `bson:"bar"`
}
此模块与 the official MongoDB Go driver 兼容,如您所见,它支持 Extended JSON formats。
您还可以访问 https://json-to-bson-map.netlify.app 来试用该模块。您可以粘贴 JSON 文档,并查看 Go BSON 结构作为输出。