如何将 json 字符串编组为 bson 文档以写入 MongoDB?
How to marshal json string to bson document for writing to MongoDB?
我正在查找的内容相当于 Document.parse()
在 golang 中,这允许我直接从 json 创建 bson 吗?我不想为编组创建中间 Go 结构
gopkg.in/mgo.v2/bson
package has a function called UnmarshalJSON
完全符合您的要求。
data
参数应将 JSON 字符串作为 []byte
值。
func UnmarshalJSON(data []byte, value interface{}) error
UnmarshalJSON unmarshals a JSON value that may hold non-standard syntax as defined in BSON's extended JSON specification.
示例:
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)
}
不再有直接使用支持的库(例如 mongo-go-driver)执行此操作的方法。您需要根据 bson 规范编写自己的转换器。
mongo-go-driver
有一个函数 bson.UnmarshalExtJSON
可以完成这项工作。
示例如下:
var doc interface{}
err := bson.UnmarshalExtJSON([]byte(`{"foo":"bar"}`), true, &doc)
if err != nil {
// handle error
}
I do not want to create intermediate Go structs for marshaling
如果您want/need创建中间 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, and as you can see it supports Extended JSON formats。
您也可以访问 https://json-to-bson-map.netlify.app 来试用该模块。您可以粘贴一个 JSON 文档,然后查看输出的 Go BSON 结构。
我正在查找的内容相当于 Document.parse()
在 golang 中,这允许我直接从 json 创建 bson 吗?我不想为编组创建中间 Go 结构
gopkg.in/mgo.v2/bson
package has a function called UnmarshalJSON
完全符合您的要求。
data
参数应将 JSON 字符串作为 []byte
值。
func UnmarshalJSON(data []byte, value interface{}) error
UnmarshalJSON unmarshals a JSON value that may hold non-standard syntax as defined in BSON's extended JSON specification.
示例:
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)
}
不再有直接使用支持的库(例如 mongo-go-driver)执行此操作的方法。您需要根据 bson 规范编写自己的转换器。
mongo-go-driver
有一个函数 bson.UnmarshalExtJSON
可以完成这项工作。
示例如下:
var doc interface{}
err := bson.UnmarshalExtJSON([]byte(`{"foo":"bar"}`), true, &doc)
if err != nil {
// handle error
}
I do not want to create intermediate Go structs for marshaling
如果您want/need创建中间 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, and as you can see it supports Extended JSON formats。
您也可以访问 https://json-to-bson-map.netlify.app 来试用该模块。您可以粘贴一个 JSON 文档,然后查看输出的 Go BSON 结构。