jsoniter_adapter.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // 设置jsoniter为默认库 // +build jsoniter // 仅当编译时带 -tags=jsoniter 参数时才生效
  2. package jsonutil
  3. import (
  4. "encoding/json"
  5. "github.com/json-iterator/go"
  6. "reflect"
  7. )
  8. var (
  9. adapter = jsoniter.ConfigCompatibleWithStandardLibrary
  10. Marshal = func(v interface{}) ([]byte, error) {
  11. if nil == v {
  12. return nil, nil
  13. }
  14. iKind := reflect.TypeOf(v).Kind()
  15. ele := reflect.ValueOf(v)
  16. if iKind == reflect.Ptr {
  17. ele = ele.Elem()
  18. }
  19. if ele.IsZero() {
  20. return nil, nil
  21. }
  22. v = ele.Interface()
  23. if nil == v {
  24. return nil, nil
  25. }
  26. if m, ok := v.(json.Marshaler); ok {
  27. if nil == m {
  28. return nil, nil
  29. }
  30. return m.MarshalJSON()
  31. }
  32. return adapter.Marshal(v)
  33. }
  34. Unmarshal = adapter.Unmarshal
  35. MarshalToString = func(v interface{}) (string, error) {
  36. if nil == v {
  37. return "", nil
  38. }
  39. iKind := reflect.TypeOf(v).Kind()
  40. ele := reflect.ValueOf(v)
  41. if iKind == reflect.Ptr {
  42. ele = ele.Elem()
  43. }
  44. if ele.IsZero() {
  45. return "", nil
  46. }
  47. v = ele.Interface()
  48. if nil == v {
  49. return "", nil
  50. }
  51. if m, ok := v.(json.Marshaler); ok {
  52. if nil == m {
  53. return "", nil
  54. }
  55. data, err := m.MarshalJSON()
  56. if nil != err {
  57. return "", err
  58. }
  59. return string(data), err
  60. }
  61. return adapter.MarshalToString(v)
  62. }
  63. UnmarshalFromString = adapter.UnmarshalFromString
  64. MarshalIndent = adapter.MarshalIndent
  65. NewDecoder = adapter.NewDecoder
  66. NewEncoder = adapter.NewEncoder
  67. )