-
Notifications
You must be signed in to change notification settings - Fork 44
/
c_json.go
76 lines (65 loc) · 1.36 KB
/
c_json.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package timeout
import (
"bytes"
"database/sql/driver"
"encoding/json"
"fmt"
"strings"
)
type DbJSON []byte
func DBJSONFromObject(obj interface{}) DbJSON {
bin, _ := json.Marshal(obj)
return DbJSON(bin)
}
func (j *DbJSON) Scan(value interface{}) error {
switch v := value.(type) {
case []byte:
return j.UnmarshalJSON(v)
case string:
return j.UnmarshalText(v)
case nil:
*j = nil
default:
return fmt.Errorf("cannot sql.Scan() DbJSON from: %#v", v)
}
return nil
}
func (j DbJSON) Value() (driver.Value, error) {
str := string(j)
if len(str) == 0 || strings.ToLower(str) == `null` {
return driver.Value(nil), nil
}
return driver.Value(str), nil
}
func (j *DbJSON) UnmarshalJSON(src []byte) (err error) {
if len(src) == 0 {
*j = []byte(`null`)
} else {
buf := bytes.NewBuffer(make([]byte, 0))
err = json.Compact(buf, src)
*j = buf.Bytes()
}
return
}
func (j DbJSON) MarshalJSON() ([]byte, error) {
if len(j) == 0 {
return []byte("null"), nil
}
return []byte(j), nil
}
func (j *DbJSON) UnmarshalText(value string) error {
return j.UnmarshalJSON([]byte(value))
}
func (j *DbJSON) Get(obj interface{}) error {
if j == nil || *j == nil {
return nil
}
return json.Unmarshal([]byte(*j), obj)
}
func (j *DbJSON) Set(obj interface{}) (err error) {
*j, err = json.Marshal(obj)
return
}
func (DbJSON) GormDataType() string {
return "JSON"
}