fastJSONSerializer.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package fastjsonserializer
  2. import (
  3. "context"
  4. "fmt"
  5. "reflect"
  6. "github.com/bytedance/sonic"
  7. "github.com/labring/aiproxy/core/common/conv"
  8. "gorm.io/gorm/schema"
  9. )
  10. type JSONSerializer struct{}
  11. func (*JSONSerializer) Scan(ctx context.Context, field *schema.Field, dst reflect.Value, dbValue any) (err error) {
  12. fieldValue := reflect.New(field.FieldType)
  13. if dbValue != nil {
  14. var bytes []byte
  15. switch v := dbValue.(type) {
  16. case []byte:
  17. bytes = v
  18. case string:
  19. bytes = conv.StringToBytes(v)
  20. default:
  21. return fmt.Errorf("failed to unmarshal JSONB value: %#v", dbValue)
  22. }
  23. if len(bytes) == 0 {
  24. field.ReflectValueOf(ctx, dst).Set(reflect.Zero(field.FieldType))
  25. return nil
  26. }
  27. err = sonic.Unmarshal(bytes, fieldValue.Interface())
  28. }
  29. field.ReflectValueOf(ctx, dst).Set(fieldValue.Elem())
  30. return
  31. }
  32. func (*JSONSerializer) Value(_ context.Context, _ *schema.Field, _ reflect.Value, fieldValue any) (any, error) {
  33. return sonic.Marshal(fieldValue)
  34. }
  35. func init() {
  36. schema.RegisterSerializer("fastjson", new(JSONSerializer))
  37. }