-
Notifications
You must be signed in to change notification settings - Fork 0
/
jsonwtf.go
61 lines (52 loc) · 1.63 KB
/
jsonwtf.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
package jsonWTF
import (
"regexp"
"strconv"
"strings"
)
type JsonWTF struct {
stringValue string
}
var (
regIsNumber = regexp.MustCompile(`^[0-9]*[.|,]?[0-9]*$`)
)
// MarshalJSON Правила для упаковки в Json
func (j JsonWTF) MarshalJSON() ([]byte, error) {
if regIsNumber.MatchString(j.stringValue) {
return []byte(strings.Replace(j.stringValue, ",", ".", 1)), nil
}
if j.stringValue == "true" || j.stringValue == "false" {
return []byte(j.stringValue), nil
}
return []byte(`"` + strings.Replace(j.stringValue, `"`, `\"`, -1) + `"`), nil
}
// UnmarshalJSON Правила для распаковки из Json
func (j *JsonWTF) UnmarshalJSON(b []byte) error {
j.stringValue = strings.Trim(string(b), `"`)
j.stringValue = strings.Replace(j.stringValue, `\"`, `"`, -1)
return nil
}
// String Вернёт строку как есть
func (j JsonWTF) String() string {
if b, err := strconv.Unquote(`"`+j.stringValue+`"`); err == nil {
return string(b)
}
return j.stringValue
}
// Float Попытается привести значение к float64
// Если НЕ получится, вернёт .0
func (j JsonWTF) Float() float64 {
f, _ := strconv.ParseFloat(strings.Replace(j.stringValue, ",", ".", 1), 64)
return f
}
// Int Попытается привести значение к int64
// Если НЕ получится, вернёт 0
func (j JsonWTF) Int64() int64 {
return int64(j.Float())
}
// Bool Попытается привести значение к bool
// Если НЕ получится, вернёт false
func (j JsonWTF) Bool() bool {
b, _ := strconv.ParseBool(j.stringValue)
return b
}