如何在golang中将json字符串编组到bson文件中以写入MongoDB?

时间:2016-09-30 06:45:08

标签: mongodb go mgo

我所期待的相当于Document.parse()

golang中的

,允许我直接从json创建bson?我不想为编组创建中间golang结构

4 个答案:

答案 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 结构作为输出。