-
Notifications
You must be signed in to change notification settings - Fork 0
/
json.go
97 lines (87 loc) · 2.35 KB
/
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package misc
import (
"encoding/json"
"io/ioutil"
)
// TJsonTool 是对于json文件的抽象,可以用匿名组合的方式进行二次包装
//
// 请注意已经被废弃,请使用JsonTool与FileUnit
type TJsonTool struct {
addr string
pData interface{}
}
// Data 从数据结构中取出指针,此时应该用.(*TYPE)转换为某指针继续使用
func (t *TJsonTool) Data() interface{} {
return t.pData
}
// readJsonFile 将filename对应的文件反序列化到data中,如果出现问题,会返回err
// 切记切记一定要传进指针
func readJsonFile(filename string, data interface{}) error {
bytes, err := ioutil.ReadFile(filename)
if err != nil {
return err
}
if err := json.Unmarshal(bytes, data); err != nil {
return err
}
return nil
}
// writeJsonFile 将data序列化到filename中,如果出现问题,会返回err
// 切记切记一定要传进指针
func writeJsonFile(filename string, data interface{}) error {
s, err := json.MarshalIndent(data, "", "\t")
if err != nil {
return err
}
err = ioutil.WriteFile(filename, s, 0666)
if err != nil {
return err
}
return nil
}
// NewTJsonTool 针对传入的数据初始化,在此时会载入数据。如果传入地址为空则不进行载入
// !!!!!!!!当传入值也能正常工作,但是传入指针可以避免浪费了右值,并且可以直接对结构体进行操作!!!!!!!
func NewTJsonTool(addr string, pData interface{}) *TJsonTool {
r := &TJsonTool{pData: pData, addr: addr}
if addr == "" {
return r
}
if !r.Load(addr) {
return nil
}
return r
}
// Load 从addr对应的文件中重新载入json配置
func (t *TJsonTool) Load(addr string) bool {
if t.addr == "" {
return false
}
err := readJsonFile(addr, &t.pData)
if err != nil {
return false
}
return true
}
// Save 序列化数据结构到文件
func (t *TJsonTool) Save() bool {
if t.addr == "" {
return false
}
return t.SaveOther(t.addr)
}
// SaveOther 序列化数据结构到某个文件
func (t *TJsonTool) SaveOther(addr string) bool {
if err := writeJsonFile(addr, t.pData); err != nil {
return false
}
return true
}
// CheckSetDefault 检查默认值是否存在,若否则置上。返回默认值是否存在
func CheckSetDefault(m *map[string]interface{}, key string, value interface{}) bool {
_, ok := (*m)[key]
if !ok {
(*m)[key] = value
return false
}
return true
}