diff --git a/internal/db/db.go b/internal/db/db.go index 30129dc..ae07f50 100644 --- a/internal/db/db.go +++ b/internal/db/db.go @@ -4,6 +4,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/synctv-org/synctv/internal/conf" "github.com/synctv-org/synctv/internal/model" + _ "github.com/synctv-org/synctv/utils/fastJSONSerializer" "gorm.io/gorm" ) diff --git a/internal/model/movie.go b/internal/model/movie.go index e2968de..b0ccb2a 100644 --- a/internal/model/movie.go +++ b/internal/model/movie.go @@ -23,5 +23,5 @@ type BaseMovieInfo struct { Proxy bool `json:"proxy"` RtmpSource bool `json:"rtmpSource"` Type string `gorm:"varchar(32)" json:"type"` - Headers map[string]string `gorm:"serializer:json" json:"headers"` + Headers map[string]string `gorm:"serializer:fastjson" json:"headers"` } diff --git a/utils/fastJSONSerializer/fastJSONSerializer.go b/utils/fastJSONSerializer/fastJSONSerializer.go new file mode 100644 index 0000000..a18ff9a --- /dev/null +++ b/utils/fastJSONSerializer/fastJSONSerializer.go @@ -0,0 +1,45 @@ +package fastjsonserializer + +import ( + "context" + "fmt" + "reflect" + + jsoniter "github.com/json-iterator/go" + + "gorm.io/gorm/schema" +) + +var json = jsoniter.ConfigCompatibleWithStandardLibrary + +type JSONSerializer struct{} + +func (*JSONSerializer) Scan(ctx context.Context, field *schema.Field, dst reflect.Value, dbValue interface{}) (err error) { + fieldValue := reflect.New(field.FieldType) + + if dbValue != nil { + var bytes []byte + switch v := dbValue.(type) { + case []byte: + bytes = v + case string: + bytes = []byte(v) + default: + return fmt.Errorf("failed to unmarshal JSONB value: %#v", dbValue) + } + + err = json.Unmarshal(bytes, fieldValue.Interface()) + } + + field.ReflectValueOf(ctx, dst).Set(fieldValue.Elem()) + return +} + +// 实现 Value 方法 +func (*JSONSerializer) Value(ctx context.Context, field *schema.Field, dst reflect.Value, fieldValue interface{}) (interface{}, error) { + return json.Marshal(fieldValue) +} + +func init() { + schema.RegisterSerializer("fastjson", new(JSONSerializer)) +}