jsonextract.go 3.2 KB

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