jsonextract.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package exprhelpers
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "strings"
  7. "github.com/buger/jsonparser"
  8. log "github.com/sirupsen/logrus"
  9. )
  10. func JsonExtractLib(jsblob string, target ...string) string {
  11. value, dataType, _, err := jsonparser.Get(
  12. jsonparser.StringToBytes(jsblob),
  13. target...,
  14. )
  15. if err != nil {
  16. if errors.Is(err, jsonparser.KeyPathNotFoundError) {
  17. log.Debugf("%+v doesn't exist", target)
  18. return ""
  19. }
  20. log.Errorf("jsonExtractLib : %+v : %s", target, err)
  21. return ""
  22. }
  23. if dataType == jsonparser.NotExist {
  24. log.Debugf("%+v doesn't exist", target)
  25. return ""
  26. }
  27. strvalue := string(value)
  28. return strvalue
  29. }
  30. func JsonExtractUnescape(jsblob string, target ...string) string {
  31. value, err := jsonparser.GetString(
  32. jsonparser.StringToBytes(jsblob),
  33. target...,
  34. )
  35. if err != nil {
  36. if errors.Is(err, jsonparser.KeyPathNotFoundError) {
  37. log.Debugf("%+v doesn't exist", target)
  38. return ""
  39. }
  40. log.Errorf("JsonExtractUnescape : %+v : %s", target, err)
  41. return ""
  42. }
  43. log.Tracef("extract path %+v", target)
  44. return value
  45. }
  46. func JsonExtract(jsblob string, target string) string {
  47. if !strings.HasPrefix(target, "[") {
  48. target = strings.ReplaceAll(target, "[", ".[")
  49. }
  50. fullpath := strings.Split(target, ".")
  51. log.Tracef("extract path %+v", fullpath)
  52. return JsonExtractLib(jsblob, fullpath...)
  53. }
  54. func jsonExtractType(jsblob string, target string, t jsonparser.ValueType) ([]byte, error) {
  55. if !strings.HasPrefix(target, "[") {
  56. target = strings.ReplaceAll(target, "[", ".[")
  57. }
  58. fullpath := strings.Split(target, ".")
  59. log.Tracef("extract path %+v", fullpath)
  60. value, dataType, _, err := jsonparser.Get(
  61. jsonparser.StringToBytes(jsblob),
  62. fullpath...,
  63. )
  64. if err != nil {
  65. if errors.Is(err, jsonparser.KeyPathNotFoundError) {
  66. log.Debugf("Key %+v doesn't exist", target)
  67. return nil, fmt.Errorf("key %s does not exist", target)
  68. }
  69. log.Errorf("jsonExtractType : %s : %s", target, err)
  70. return nil, fmt.Errorf("jsonExtractType: %s : %w", target, err)
  71. }
  72. if dataType != t {
  73. log.Errorf("jsonExtractType : expected type %s for target %s but found %s", t, target, dataType.String())
  74. return nil, fmt.Errorf("jsonExtractType: expected type %s for target %s but found %s", t, target, dataType.String())
  75. }
  76. return value, nil
  77. }
  78. func JsonExtractSlice(jsblob string, target string) []interface{} {
  79. value, err := jsonExtractType(jsblob, target, jsonparser.Array)
  80. if err != nil {
  81. log.Errorf("JsonExtractSlice : %s", err)
  82. return nil
  83. }
  84. s := make([]interface{}, 0)
  85. err = json.Unmarshal(value, &s)
  86. if err != nil {
  87. log.Errorf("JsonExtractSlice: could not convert '%s' to slice: %s", value, err)
  88. return nil
  89. }
  90. return s
  91. }
  92. func JsonExtractObject(jsblob string, target string) map[string]interface{} {
  93. value, err := jsonExtractType(jsblob, target, jsonparser.Object)
  94. if err != nil {
  95. log.Errorf("JsonExtractObject: %s", err)
  96. return nil
  97. }
  98. s := make(map[string]interface{})
  99. err = json.Unmarshal(value, &s)
  100. if err != nil {
  101. log.Errorf("JsonExtractObject: could not convert '%s' to map[string]interface{}: %s", value, err)
  102. return nil
  103. }
  104. return s
  105. }
  106. func ToJson(obj interface{}) string {
  107. b, err := json.Marshal(obj)
  108. if err != nil {
  109. log.Errorf("ToJson : %s", err)
  110. return ""
  111. }
  112. return string(b)
  113. }