59 lines
1.1 KiB
Go
59 lines
1.1 KiB
Go
package model
|
|
|
|
import (
|
|
"database/sql/driver"
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
)
|
|
|
|
// JSON 是经过合法性检查的通用文档。输入内容应使用版本化结构或业务侧引用,
|
|
// Orbit 不解释行业专用字段。
|
|
type JSON json.RawMessage
|
|
|
|
func (j JSON) Value() (driver.Value, error) {
|
|
if j == nil {
|
|
return nil, nil
|
|
}
|
|
if !json.Valid(j) {
|
|
return nil, errors.New("invalid JSON document")
|
|
}
|
|
return []byte(j), nil
|
|
}
|
|
func (j *JSON) Scan(src any) error {
|
|
if src == nil {
|
|
*j = nil
|
|
return nil
|
|
}
|
|
var b []byte
|
|
switch v := src.(type) {
|
|
case []byte:
|
|
b = v
|
|
case string:
|
|
b = []byte(v)
|
|
default:
|
|
return fmt.Errorf("JSON: unsupported source %T", src)
|
|
}
|
|
if !json.Valid(b) {
|
|
return errors.New("invalid JSON document")
|
|
}
|
|
*j = append((*j)[:0], b...)
|
|
return nil
|
|
}
|
|
func (j JSON) MarshalJSON() ([]byte, error) {
|
|
if j == nil {
|
|
return []byte("null"), nil
|
|
}
|
|
if !json.Valid(j) {
|
|
return nil, errors.New("invalid JSON document")
|
|
}
|
|
return []byte(j), nil
|
|
}
|
|
func (j *JSON) UnmarshalJSON(b []byte) error {
|
|
if !json.Valid(b) {
|
|
return errors.New("invalid JSON document")
|
|
}
|
|
*j = append((*j)[:0], b...)
|
|
return nil
|
|
}
|