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  }