我在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))
您的代碼有效。請告訴我們你是如何使用它的。 – icza
@icza增加了一個例子 – buddy123
什麼是你的代碼中的'b3'? – icza