У меня есть следующий тип в Golang:Пользовательские сортировочная для BSON и JSON (Golang и Ий)
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, но кажется, что только геттер работает правильно
JSON unmarshaling из кодированной строки 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))
Ваш код работает. Пожалуйста, покажите нам, как вы его используете. – icza
@icza Добавлен пример – buddy123
А что такое 'b3' в вашем коде? – icza