json_map.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. package xvdoc
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "reflect"
  6. "strconv"
  7. )
  8. type JSONMap map[string]interface{}
  9. func (s JSONMap) Bool(key string, defaultVal bool) bool {
  10. if res, check := s[key].(bool); check {
  11. return res
  12. }
  13. return defaultVal
  14. }
  15. func (s JSONMap) Int(key string, defaultVal int64) int64 {
  16. if iface, check := s[key]; check {
  17. rVal := reflect.ValueOf(iface)
  18. switch rVal.Kind() {
  19. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  20. return rVal.Int()
  21. case reflect.Float32, reflect.Float64:
  22. return int64(rVal.Float())
  23. }
  24. }
  25. return defaultVal
  26. }
  27. func (s JSONMap) Value(key string, defaultVal interface{}) interface{} {
  28. if iface, check := s[key]; check {
  29. dVal := reflect.ValueOf(defaultVal)
  30. if !dVal.IsValid() {
  31. return iface
  32. } else {
  33. lVal := reflect.ValueOf(iface)
  34. if !lVal.IsValid() {
  35. return defaultVal
  36. } else if lVal.Kind() == dVal.Kind() {
  37. return iface
  38. } else if lVal.Type().ConvertibleTo(dVal.Type()) {
  39. return lVal.Convert(dVal.Type()).Interface()
  40. } else {
  41. if lVal.Kind() == reflect.String {
  42. switch dVal.Kind() {
  43. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  44. if val, err := strconv.Atoi(lVal.String()); err != nil {
  45. return defaultVal
  46. } else {
  47. lVal = reflect.ValueOf(val)
  48. return lVal.Convert(dVal.Type())
  49. }
  50. case reflect.Float32, reflect.Float64:
  51. if val, err := strconv.ParseFloat(lVal.String(), 64); err != nil {
  52. return defaultVal
  53. } else {
  54. lVal = reflect.ValueOf(val)
  55. return lVal.Convert(dVal.Type())
  56. }
  57. }
  58. }
  59. }
  60. }
  61. }
  62. return defaultVal
  63. }
  64. func (s JSONMap) StringVal(key, defaultVal string) string {
  65. if iface, check := s[key]; check {
  66. return fmt.Sprint(iface)
  67. }
  68. return defaultVal
  69. }
  70. func (s JSONMap) Interface(key string) interface{} {
  71. return s[key]
  72. }
  73. func (s JSONMap) StringArray(key string) (res []string) {
  74. if arr, check := s[key].([]interface{}); check {
  75. res = make([]string, len(arr))
  76. for i, v := range arr {
  77. res[i] = fmt.Sprint(v)
  78. }
  79. }
  80. return
  81. }
  82. func (s JSONMap) Array(key string) (res []interface{}) {
  83. if arr, check := s[key].([]interface{}); check {
  84. res = arr
  85. }
  86. return
  87. }
  88. func (s JSONMap) JSONMap(key string) (res JSONMap) {
  89. if m, check := s[key].(map[string]interface{}); check {
  90. res = JSONMap(m)
  91. }
  92. return
  93. }
  94. func (s JSONMap) KeyExists(key string) (check bool) {
  95. _, check = s[key]
  96. return check
  97. }
  98. func (s JSONMap) Copy() JSONMap {
  99. res := make(JSONMap)
  100. for key, val := range s {
  101. res[key] = val
  102. }
  103. return res
  104. }
  105. func (s JSONMap) JSON() (res []byte) {
  106. res, _ = json.Marshal(&s)
  107. return
  108. }
  109. func (s JSONMap) Map() map[string]interface{} {
  110. return map[string]interface{}(s)
  111. }
  112. func copyMap(m map[string]interface{}) (res map[string]interface{}) {
  113. res = make(map[string]interface{})
  114. for key, val := range m {
  115. switch val.(type) {
  116. case []interface{}:
  117. res[key] = copySlice(val.([]interface{}))
  118. case map[string]interface{}:
  119. res[key] = copyMap(val.(map[string]interface{}))
  120. default:
  121. res[key] = val
  122. }
  123. }
  124. return
  125. }
  126. func copySlice(arr []interface{}) (res []interface{}) {
  127. res = make([]interface{}, len(arr))
  128. for i, v := range arr {
  129. switch v.(type) {
  130. case []interface{}:
  131. res[i] = copySlice(v.([]interface{}))
  132. case map[string]interface{}:
  133. res[i] = copyMap(v.(map[string]interface{}))
  134. default:
  135. res[i] = v
  136. }
  137. }
  138. return
  139. }
  140. func mergeSlices(aSource, aMerge []interface{}) []interface{} {
  141. return append(aSource, aMerge...)
  142. }
  143. func mergeMaps(mSource, mMerge map[string]interface{}) (res map[string]interface{}) {
  144. res = copyMap(mSource)
  145. // merge result with result map
  146. for key, val := range mMerge {
  147. if sVal, check := res[key]; check {
  148. switch val.(type) {
  149. case map[string]interface{}:
  150. {
  151. if m, check := sVal.(map[string]interface{}); check {
  152. res[key] = mergeMaps(m, val.(map[string]interface{}))
  153. } else if val == nil {
  154. res[key] = val
  155. }
  156. }
  157. case []interface{}:
  158. {
  159. if arr, check := sVal.([]interface{}); check {
  160. res[key] = mergeSlices(arr, val.([]interface{}))
  161. } else if val == nil {
  162. res[key] = val
  163. }
  164. }
  165. default:
  166. res[key] = val
  167. }
  168. } else {
  169. switch val.(type) {
  170. case map[string]interface{}:
  171. res[key] = copyMap(val.(map[string]interface{}))
  172. case []interface{}:
  173. res[key] = copySlice(val.([]interface{}))
  174. default:
  175. res[key] = val
  176. }
  177. }
  178. }
  179. return
  180. }
  181. func mapJSON(m map[string]interface{}) (res []byte) {
  182. res, _ = json.Marshal(&m)
  183. return
  184. }