我正在寻找的是等同于Document.parse()在golang中,这允许我直接从json创建bson?我不想创建中间的Go语言结构体来进行封送处理
gv8xihay1#
gopkg.in/mgo.v2/bson包有一个名为UnmarshalJSON的函数,它完全可以完成您想要的任务。data参数应将JSON字符串保存为[]byte值。
gopkg.in/mgo.v2/bson
UnmarshalJSON
data
[]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) }
zdwk9cvp2#
mongo-go-driver有一个函数bson.UnmarshalExtJSON来完成这项工作。下面是一个例子:
mongo-go-driver
bson.UnmarshalExtJSON
var doc interface{} err := bson.UnmarshalExtJSON([]byte(`{"foo":"bar"}`), true, &doc) if err != nil { // handle error }
b4qexyjb3#
现在已经没有办法直接使用支持的库(例如mongo-go-driver)来实现这一点了,你需要根据bson规范编写自己的转换器。编辑:这里有一个到目前为止已经在prod.https://github.com/dustinevan/mongo/blob/main/bsoncv/bsoncv.go中使用了几TB
xlpyo6sf4#
我不想为封送处理创建中间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结构体。
g6baxovj5#
使用go.mongodb.org/mongo-driver/bson/bsonrw的简单转换器:
go.mongodb.org/mongo-driver/bson/bsonrw
func JsonToBson(message []byte) ([]byte, error) { reader, err := bsonrw.NewExtJSONValueReader(bytes.NewReader(message), true) if err != nil { return []byte{}, err } buf := &bytes.Buffer{} writer, _ := bsonrw.NewBSONValueWriter(buf) err = bsonrw.Copier{}.CopyDocument(writer, reader) if err != nil { return []byte{}, err } marshaled := buf.Bytes() return marshaled, nil }
5条答案
按热度按时间gv8xihay1#
gopkg.in/mgo.v2/bson
包有一个名为UnmarshalJSON
的函数,它完全可以完成您想要的任务。data
参数应将JSON字符串保存为[]byte
值。UnmarshalJSON对可能包含BSON扩展JSON规范中定义的非标准语法的JSON值进行解组。
示例:
zdwk9cvp2#
mongo-go-driver
有一个函数bson.UnmarshalExtJSON
来完成这项工作。下面是一个例子:
b4qexyjb3#
现在已经没有办法直接使用支持的库(例如mongo-go-driver)来实现这一点了,你需要根据bson规范编写自己的转换器。
编辑:这里有一个到目前为止已经在prod.https://github.com/dustinevan/mongo/blob/main/bsoncv/bsoncv.go中使用了几TB
xlpyo6sf4#
我不想为封送处理创建中间Go语言结构体
如果你想/需要创建一个中间的Go BSON结构体,你可以使用一个转换模块,比如github.com/sindbach/json-to-bson-go。
将产生输出:
该模块与the official MongoDB Go driver兼容,并且如您所见,它支持Extended JSON formats。
您也可以访问https://json-to-bson-map.netlify.app来尝试运行该模块,您可以粘贴一个JSON文档,然后看到输出的Go BSON结构体。
g6baxovj5#
使用
go.mongodb.org/mongo-driver/bson/bsonrw
的简单转换器: