json.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. package config
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "io/ioutil"
  7. "os"
  8. "sync"
  9. )
  10. func init() {
  11. Register("json", &JsonConfig{})
  12. }
  13. type JsonConfig struct{}
  14. type JsonConfigContainer struct {
  15. data map[string]interface{}
  16. rawData []byte
  17. sync.RWMutex
  18. }
  19. func (js *JsonConfig) ParseFile(filename string) (Configer, error) {
  20. file, err := os.Open(filename)
  21. if err != nil {
  22. return nil, err
  23. }
  24. defer file.Close()
  25. content, err := ioutil.ReadAll(file)
  26. if err != nil {
  27. return nil, err
  28. }
  29. return js.ParseData(content)
  30. }
  31. func (js *JsonConfig) ParseData(data []byte) (Configer, error) {
  32. x := &JsonConfigContainer{
  33. rawData: data,
  34. data: make(map[string]interface{}),
  35. }
  36. err := json.Unmarshal(data, &x.data)
  37. if err != nil {
  38. return nil, err
  39. }
  40. return x, nil
  41. }
  42. func (c *JsonConfigContainer) Set(key, val string) error {
  43. c.Lock()
  44. defer c.Unlock()
  45. c.data[key] = val
  46. return nil
  47. }
  48. func (c *JsonConfigContainer) Get(key string) (interface{}, error) {
  49. c.Lock()
  50. defer c.Unlock()
  51. val, ok := c.data[key]
  52. if !ok {
  53. return nil, fmt.Errorf("Config:not find key:%s value", key)
  54. }
  55. return val, nil
  56. }
  57. func (c *JsonConfigContainer) String(key string) (string, error) {
  58. val, err := c.Get(key)
  59. if err != nil {
  60. return "", err
  61. }
  62. if v, ok := val.(string); ok {
  63. return v, nil
  64. }
  65. return "", errors.New("not string value")
  66. }
  67. func (c *JsonConfigContainer) Int64(key string) (int64, error) {
  68. val, err := c.Get(key)
  69. if err != nil {
  70. return 0, err
  71. }
  72. if v, ok := val.(float64); ok {
  73. return int64(v), nil
  74. }
  75. return 0, errors.New("not int64 value")
  76. }
  77. func (c *JsonConfigContainer) Int(key string) (int, error) {
  78. val, err := c.Get(key)
  79. if err != nil {
  80. return 0, err
  81. }
  82. if v, ok := val.(float64); ok {
  83. return int(v), nil
  84. }
  85. return 0, errors.New("not int value")
  86. }
  87. func (c *JsonConfigContainer) Float64(key string) (float64, error) {
  88. val, err := c.Get(key)
  89. if err != nil {
  90. return 0.0, err
  91. }
  92. if v, ok := val.(float64); ok {
  93. return v, nil
  94. }
  95. return 0.0, errors.New("not float64 value")
  96. }
  97. func (c *JsonConfigContainer) Bool(key string) (bool, error) {
  98. val, err := c.Get(key)
  99. if err != nil {
  100. return false, err
  101. }
  102. return ParseBool(val)
  103. }
  104. func ParseBool(val interface{}) (value bool, err error) {
  105. if val != nil {
  106. switch v := val.(type) {
  107. case bool:
  108. return v, nil
  109. case string:
  110. switch v {
  111. case "1", "t", "T", "true", "TRUE", "True", "YES", "yes", "Yes", "Y", "y", "ON", "on", "On":
  112. return true, nil
  113. case "0", "f", "F", "false", "FALSE", "False", "NO", "no", "No", "N", "n", "OFF", "off", "Off":
  114. return false, nil
  115. }
  116. case int8, int32, int64:
  117. strV := fmt.Sprintf("%d", v)
  118. if strV == "1" {
  119. return true, nil
  120. } else if strV == "0" {
  121. return false, nil
  122. }
  123. case float64:
  124. if v == 1.0 {
  125. return true, nil
  126. } else if v == 0.0 {
  127. return false, nil
  128. }
  129. }
  130. return false, fmt.Errorf("parsing %q: invalid syntax", val)
  131. }
  132. return false, fmt.Errorf("parsing <nil>: invalid syntax")
  133. }
  134. func (c *JsonConfigContainer) RawData() []byte {
  135. return c.rawData
  136. }