github.com/sereiner/library@v0.0.0-20200518095232-1fa3e640cc5f/sms/json.go (about) 1 package sms 2 3 import ( 4 "encoding/json" 5 "errors" 6 "fmt" 7 "strings" 8 9 "github.com/sereiner/library/concurrent/cmap" 10 "github.com/sereiner/library/jsons" 11 "github.com/sereiner/library/transform" 12 ) 13 14 //JSONConf json配置文件 15 type JSONConf struct { 16 data map[string]interface{} 17 cache cmap.ConcurrentMap 18 Content string 19 version int32 20 *transform.Transform 21 } 22 23 //NewJSONConfWithJson 根据JSON初始化conf对象 24 func NewJSONConfWithJson(c string, version int32, i interface{}) (r *JSONConf, err error) { 25 m := make(map[string]interface{}) 26 err = json.Unmarshal([]byte(c), &m) 27 if err != nil { 28 return 29 } 30 return &JSONConf{ 31 Content: c, 32 data: m, 33 cache: cmap.New(8), 34 Transform: transform.NewMaps(m), 35 version: version, 36 }, nil 37 } 38 39 //NewJSONConfWithEmpty 初始化空的conf对象 40 func NewJSONConfWithEmpty() *JSONConf { 41 return NewJSONConfWithHandle(make(map[string]interface{}), 0) 42 } 43 44 //NewJSONConfWithHandle 根据map和动态获取函数构建 45 func NewJSONConfWithHandle(m map[string]interface{}, version int32) *JSONConf { 46 47 return &JSONConf{ 48 data: m, 49 cache: cmap.New(8), 50 Transform: transform.NewMaps(m), 51 version: version, 52 } 53 } 54 55 //GetData 获取原始数据 56 func (j *JSONConf) GetData() map[string]interface{} { 57 r, _ := jsons.Unmarshal([]byte(j.Content)) 58 return r 59 } 60 61 //GetContent 获取输入JSON原串 62 func (j *JSONConf) GetContent() string { 63 return j.Content 64 } 65 66 //Len 获取参数个数 67 func (j *JSONConf) Len() int { 68 return len(j.data) 69 } 70 71 //GetVersion 获取当前配置的版本号 72 func (j *JSONConf) GetVersion() int32 { 73 return j.version 74 } 75 76 //Set 设置参数值 77 func (j *JSONConf) Set(key string, value string) { 78 if _, ok := j.data[key]; ok { 79 return 80 } 81 j.Transform.Set(key, value) 82 } 83 84 //String 获取字符串,已缓存则从缓存中获取 85 func (j *JSONConf) String(key string, def ...string) (r string) { 86 if v, err := j.Transform.Get(key); err == nil { 87 return v 88 } 89 if len(def) > 0 { 90 return def[0] 91 } 92 return "" 93 } 94 95 //GetArray 获取数组列表 96 func (j *JSONConf) GetArray(key string) (r []interface{}, err error) { 97 d, ok := j.data[key] 98 if !ok { 99 err = fmt.Errorf("不包含数据:%s", key) 100 return 101 } 102 if r, ok := d.([]interface{}); ok { 103 return r, nil 104 } 105 err = fmt.Errorf("不包含数据:%s", key) 106 return 107 } 108 109 //Strings 获取字符串数组,原字符串以“;”号分隔 110 func (j *JSONConf) Strings(key string, def ...[]string) (r []string) { 111 stringVal := j.String(key) 112 if stringVal != "" { 113 r = strings.Split(j.String(key), ";") 114 return 115 } 116 if len(def) > 0 { 117 return def[0] 118 } 119 return []string{} 120 } 121 122 //Each 循化每个节点值 123 func (j *JSONConf) Each(f func(key string)) { 124 for k := range j.data { 125 f(k) 126 } 127 } 128 129 //GetSMap 获取map数据 130 func (j *JSONConf) GetSMap(section string) (map[string]string, error) { 131 data := make(map[string]string) 132 val := j.data[section] 133 if val != nil { 134 if v, ok := val.(map[string]interface{}); ok { 135 for k, a := range v { 136 data[k] = j.TranslateAll(fmt.Sprintf("%s", a), false) 137 } 138 } 139 } 140 return data, nil 141 } 142 143 //GetSectionString 获取section原始JSON串 144 func (j *JSONConf) GetSectionString(section string) (r string, err error) { 145 //nkey := "_section_string_" + section 146 //if value, ok := j.cache.Get(nkey); ok { 147 //return value.(string), nil 148 //} 149 val := j.data[section] 150 if val != nil { 151 buffer, err := json.Marshal(val) 152 if err != nil { 153 return "", err 154 } 155 r = j.TranslateAll(jsons.Escape(string(buffer)), false) 156 // j.cache.Set(nkey, r) 157 return r, nil 158 } 159 err = errors.New("not exist section:" + section) 160 return 161 }