首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用go-mongo-driver将BSON字符串值解组为自定义类型?

如何使用go-mongo-driver将BSON字符串值解组为自定义类型?
EN

Stack Overflow用户
提问于 2021-07-18 12:29:56
回答 1查看 114关注 0票数 0

我使用MarshalBSONValue将内部结构字段封送到自定义字符串表示形式。

我不知道如何实现逆操作UnmarshalBSONValue,以便将自定义字符串表示解析为内部结构。

代码语言:javascript
复制
import (
    "fmt"
    "testing"

    "github.com/stretchr/testify/assert"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/bson/bsontype"
)

type inner struct {
    value string
}

func (i inner) MarshalBSONValue() (bsontype.Type, []byte, error) {
    return bsontype.String, []byte(i.value), nil
}

// How to implement this?
//
// func (i *inner) UnmarshalBSONValue(t bsontype.Type, data []byte) error {
//     ...
// }

type Outer struct {
    Inner inner `bson:"inner"`
}

func TestMarshalBSON(t *testing.T) {
    var outer1 = Outer{Inner: inner{value: "value"}}
    doc, err := bson.Marshal(outer1)
    assert.NoError(t, err)
    fmt.Printf("%#v\n", string(doc)) // "\x11\x00\x00\x00\x02inner\x00value\x00"

    var outer2 Outer
    err = bson.Unmarshal(doc, &outer2) // error
    assert.NoError(t, err)

    assert.Equal(t, outer1, outer2)
}

如果有人能为上面的示例测试提供UnmarshalBSONValue的工作实现,我将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-18 14:13:27

您可以使用bsoncore.ReadString来解析给定值。

代码语言:javascript
复制
func (i inner) MarshalBSONValue() (bsontype.Type, []byte, error) {
    return bson.MarshalValue(i.value)
}

func (i *inner) UnmarshalBSONValue(t bsontype.Type, value []byte) error {
    if t != bsontype.String {
        return fmt.Errorf("invalid bson value type '%s'", t.String())
    }
    s, _, ok := bsoncore.ReadString(value)
    if !ok {
        return fmt.Errorf("invalid bson string value")
    }

    i.value = s
    return nil
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68426012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档