Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bson和JSON的自定义编组(Golang&;mgo)_Json_Mongodb_Go_Bson_Mgo - Fatal编程技术网

bson和JSON的自定义编组(Golang&;mgo)

bson和JSON的自定义编组(Golang&;mgo),json,mongodb,go,bson,mgo,Json,Mongodb,Go,Bson,Mgo,我在Golang有以下类型: 键入Base64Data[]字节 为了支持将base64编码字符串解组为该类型,我执行了以下操作: func (b *Base64Data) UnmarshalJSON(data []byte) error { if len(data) == 0 { return nil } content, err := base64.StdEncoding.DecodeString(string(data[1 : len(data)-1

我在Golang有以下类型:

键入Base64Data[]字节

为了支持将base64编码字符串解组为该类型,我执行了以下操作:

func (b *Base64Data) UnmarshalJSON(data []byte) error {
    if len(data) == 0 {
        return nil
    }

    content, err := base64.StdEncoding.DecodeString(string(data[1 : len(data)-1]))
    if err != nil {
        return err
    }

    *b = []byte(xml)
    return nil
}
func (b Base64Data) GetBSON() (interface{}, error) {
    return base64.StdEncoding.EncodeToString([]byte(b)), nil
}

func (b *Base64DecodedXml) SetBSON(raw bson.Raw) error {
    var s string
    var err error
    if err = raw.Unmarshal(&s); err != nil {
        return err
    }
    *b, err = base64.StdEncoding.DecodeString(s)
    return err
}
现在,我还希望能够使用mgo Golang库将其封送和解封送到mongo数据库。 问题是我已经将文档存储为base64编码字符串,所以我必须维护它。 我试着做到以下几点:

func (b *Base64Data) UnmarshalJSON(data []byte) error {
    if len(data) == 0 {
        return nil
    }

    content, err := base64.StdEncoding.DecodeString(string(data[1 : len(data)-1]))
    if err != nil {
        return err
    }

    *b = []byte(xml)
    return nil
}
func (b Base64Data) GetBSON() (interface{}, error) {
    return base64.StdEncoding.EncodeToString([]byte(b)), nil
}

func (b *Base64DecodedXml) SetBSON(raw bson.Raw) error {
    var s string
    var err error
    if err = raw.Unmarshal(&s); err != nil {
        return err
    }
    *b, err = base64.StdEncoding.DecodeString(s)
    return err
}
因此,在解组后,数据已经解码,因此我需要对其进行编码,并将其作为字符串返回,以便将其作为字符串写入db(反之亦然) 为此,我实现了bson getter和setter,但似乎只有getter工作正常

JSON从base64编码的字符串解组,以及将其封送到数据库。但解包二传似乎根本不被调用

有人能告诉我遗漏了什么,这样我就能够正确地保存在内存中解码的数据,但是编码的字符串类型

这是我尝试运行的测试:

b := struct {
    Value shared.Base64Data `json:"value" bson:"value"`
}{}
s := `{"value": "PHJvb3Q+aGVsbG88L3Jvb3Q+"}`
require.NoError(t, json.Unmarshal([]byte(s), &b))
t.Logf("%v", string(b.Value))
b4, err := bson.Marshal(b)
require.NoError(t, err)
t.Logf("%v", string(b4))
require.NoError(t, bson.Unmarshal(b4, &b))
t.Logf("%v", string(b.Value))

您不能仅使用映射和结构值封送任何值

如果要测试它,请传递一个
映射
,例如传递到
bson.Marshal()

您的代码按原样工作,并按您的意愿工作。尝试插入包装器值以验证它:

c := sess.DB("testdb").C("testcoll")

var x = Base64Data{0x01, 0x02, 0x03}
if err := c.Insert(bson.M{
    "data": x,
}); err != nil {
    panic(err)
}
这将把数据保存为
字符串
,即Base64编码形式


当然,如果要将其加载回类型为
Base64Data
的值,还需要定义
SetBSON(raw-raw)error
方法(接口)。

您的代码可以正常工作。请告诉我们您如何使用它。@icza添加了一个示例,以及您的代码中的
b3
是什么?@icza很抱歉,它只是
b3:=Base64Data(b.Value)
,但我在未完全编辑文章的情况下删除了它。谢谢。我测试错了。事实上,向bson出售marsaling很有效。所以我实际上需要通过编写setter来完成我的实现。但它似乎一点也不叫。我编辑了我的问题,你能建议我对setter做了什么吗?@buddy123你将它保存为
string
类型的值,所以你应该将原始值解组为
string
类型的值,而不是
[]byte
。这让我感到困惑。你说得对,但当我解开一根绳子时,它仍然不起作用。我编辑了我的setter@buddy123因为您使用了错误的接收器类型:
b*Base64DecodedXml
,所以它应该是
b*Base64Data