2017-02-03 85 views
1

我在Golang以下類型:定製編組到BSON和JSON(Golang&MgO)的

type Base64Data []byte

爲了支持解組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 
} 

現在我還希望能夠使用mgo Golang庫對它進行編組和解組。 問題是我已經有文件存儲爲base64編碼的字符串,所以我必須保持這一點。 我試着做到以下幾點:

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 
} 

所以說解編後,該數據已經解碼的,所以我需要編碼回來,並返回一個字符串,它會被寫入到數據庫作爲一個字符串(反之亦然) 對於我實現BSON getter和setter,但似乎只有吸氣由編碼字符串的base64工作正常

JSON拆封,以及它編組到數據庫中。但毫不起眼的二傳手似乎根本不會被調用。

任何人都可以建議我失蹤,這樣我就能夠正確地保存在內存中解碼的數據,但編碼的字符串類型?

這是一個測試我試圖運行:

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)) 
+0

您的代碼有效。請告訴我們你是如何使用它的。 – icza

+0

@icza增加了一個例子 – buddy123

+0

什麼是你的代碼中的'b3'? – icza

回答

1

你不能bson.Marshal(),只有地圖和結構值封送的任何值。

如果你想測試它,通過一個map,例如, bson.Mbson.Marshal()

var x = Base64Data{0x01, 0x02, 0x03} 

dd, err := bson.Marshal(bson.M{"data": x}) 
fmt.Println(string(dd), err) 

你的代碼工作,就是和你想讓它。嘗試插入包裝值來驗證它:

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

var x = Base64Data{0x01, 0x02, 0x03} 
if err := c.Insert(bson.M{ 
    "data": x, 
}); err != nil { 
    panic(err) 
} 

這將數據保存爲string,爲Base64編碼格式。

當然,如果您想將其加載回Base64Data類型的值,您還需要定義SetBSON(raw Raw) error方法(bson.Setter接口)。

+0

謝謝。我錯誤地測試了它。事實上,對巴森的打擊行之有效。所以我實際上需要通過編寫setter來完成我的實現。但它似乎並沒有被調用。我編輯了我的問題,你能提出一些建議嗎? – buddy123

+0

@ buddy123將其保存爲'string'類型的值,因此您應該將原始值解組爲'string'類型的值,而不是'[] byte'。 – icza

+0

這讓我感到困惑。你是對的,但是當我對一個字符串解組時,它仍然不起作用。我編輯了我的setter – buddy123