package db import ( "context" "fmt" "reflect" "gitlink.org.cn/cloudream/common/utils/serder" "gorm.io/gorm/schema" ) type JSONSerializer struct { } func (JSONSerializer) Scan(ctx context.Context, field *schema.Field, dst reflect.Value, dbValue interface{}) error { fieldValue := reflect.New(field.FieldType) if dbValue != nil { var data []byte switch v := dbValue.(type) { case []byte: data = v case string: data = []byte(v) default: return fmt.Errorf("failed to unmarshal JSONB value: %#v", dbValue) } err := serder.JSONToObject(data, fieldValue.Interface()) if err != nil { return err } } field.ReflectValueOf(ctx, dst).Set(fieldValue.Elem()) return nil } func (JSONSerializer) Value(ctx context.Context, field *schema.Field, dst reflect.Value, fieldValue interface{}) (interface{}, error) { return serder.ObjectToJSON(fieldValue) } func init() { schema.RegisterSerializer("json", JSONSerializer{}) }