123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- package types
- import (
- "database/sql/driver"
- "encoding/json"
- "errors"
- )
- type JSONText json.RawMessage
- var emptyJSON = JSONText("{}")
- func (j JSONText) MarshalJSON() ([]byte, error) {
- if len(j) == 0 {
- return emptyJSON, nil
- }
- return j, nil
- }
- func (j *JSONText) UnmarshalJSON(data []byte) error {
- if j == nil {
- return errors.New("JSONText: UnmarshalJSON on nil pointer")
- }
- *j = append((*j)[0:0], data...)
- return nil
- }
- func (j JSONText) Value() (driver.Value, error) {
- var m json.RawMessage
- var err = j.Unmarshal(&m)
- if err != nil {
- return []byte{}, err
- }
- return []byte(j), nil
- }
- func (j *JSONText) Scan(src interface{}) error {
- var source []byte
- switch t := src.(type) {
- case string:
- source = []byte(t)
- case []byte:
- if len(t) == 0 {
- source = emptyJSON
- } else {
- source = t
- }
- case nil:
- *j = emptyJSON
- default:
- return errors.New("Incompatible type for JSONText")
- }
- *j = JSONText(append((*j)[0:0], source...))
- return nil
- }
- func (j *JSONText) Unmarshal(v interface{}) error {
- if len(*j) == 0 {
- *j = emptyJSON
- }
- return json.Unmarshal([]byte(*j), v)
- }
- func (j JSONText) String() string {
- return string(j)
- }
- type NullJSONText struct {
- JSONText
- Valid bool
- }
- func (n *NullJSONText) Scan(value interface{}) error {
- if value == nil {
- n.JSONText, n.Valid = emptyJSON, false
- return nil
- }
- n.Valid = true
- return n.JSONText.Scan(value)
- }
- func (n NullJSONText) Value() (driver.Value, error) {
- if !n.Valid {
- return nil, nil
- }
- return n.JSONText.Value()
- }
|